1、进程概念
进程编号是PID,磁盘文件编号是inode
进程(process)和线程(thread):一个进程可能包含一个或多个线程,比如盖一座大楼,团队就是一个进程,一个人就是一个线程,线程占用的内存空间小,省资源。
如下图http进程有很多个子进程,子进程又分成多个线程
2、进程优先级
进程优先级:
系统优先级:数字越小,优先级越高,各有140个运行队列和等待队列
0-139(CentOS4,5)
0-98,99(CentOS6)
实时优先级realtime:99-0:值最大优先级最高
nice值:-20到19,对应系统优先级100-139或99
3、进程内存
内存分页存储,一页是4k。
LRU算法:来了一个数据就放到最上面,把下面的挤下去,如果来的数据内存中本来就有,则把它调到最上面。
4、进程分类
守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程,是用户登录之后启动的进程。
5、进程状态
运行态:running
就绪态:ready
睡眠态:sleep,睡眠态又分为可中断和不可中断的睡眠态
可中断:interruptable
不可中断:uninterruptable
停止态:stopped,暂停于内存,但不会被调度,除非手动启动
僵死态:zombie,在内存中,不会被启动的进程,出了问题的进程,会一直占用内存。
6、PS命令
[root@centos6 html]#ps axu ---查看所有进程,包括前台进程和守护进程,u表示显示进程生效的所有者
VSZ: Virtual memory SiZe,虚拟内存集,线性内存,也就是系统承诺给的内存
RSS: ReSidentSize, 常驻内存集,实际用的内存
一般情况下系统承诺给的内存很多,但实际用的很少。
[root@centos6 ~]#ps auxf -- f表示显示进程的父进程
[root@centos6 ~]#ps axo pid,cmd,nice --指定显示哪些特性
[root@centos6 ~]#ps -C vim f1 -C vim f2 o pid,cmd,nice --- -C选项可以显示单独的某一个进程,默认是全部显示
[root@centos6 ~]#ps axu |grep 2078 --还可以过滤
root 2078 0.0 0.3 177464 3880 ? Ss 09:37 0:00 /usr/sbin/httpd
root 2485 0.0 0.0 103328 868 pts/0 R+ 10:19 0:00 grep 2078
STAT:进程状态
R:running 运行
S: interruptablesleeping 可中断的睡眠态
D: uninterruptable sleeping 不可中断的睡眠态
T: stopped --停止态,手动可以被启动
Z: zombie ---僵死态,不可被启动
+: 前台进程
l: 多线程进程
L:内存分页并带锁
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
7、进程优先级的调整
[root@centos6 ~]#renice -n -10 2410 ---调整nice优先级为-10,2410是进程编号
root@centos6 app]#nice -n -10 vim f1 ---指定优先级打开某个程序
8、搜索进程pgrep
[root@centos6 ~]#pgrep -lu dufu ---显示生效者
2493 bash
[root@centos6 ~]#pgrep -lU dufu ---显示正真发起运行命令者
2493 bash
2571 passwd
[root@centos6 ~]#pgrep -lt pts/1 ---指定终端的进程
2307 bash
2492 su
2493 bash
2571 passwd
-l 显示进程名
[root@centos6 ~]#pidof vim
[root@centos6 ~]#echo $?
1
[root@centos6 ~]#pidof httpd
2088 2087 2086 2085 2084 2083 2082 2081 2078
[root@centos6 ~]#echo $?
0
总结:查看某个进程的编号,此方法可以写到脚本里,用来判断电脑上是否跑了某个进程,如果跑了这个进程
9、uptime
显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10分钟的平均负载,一般不会超过1)
系统平均负载:
指在特定时间间隔内运行队列中的平均进程数
通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用
[root@centos6 ~]#uptime
10:41:06 up 2:28, 4 users, load average: 0.00, 0.00, 0.00
10、top命令
可以动态的显示进程的信息
选项:
-d #: 指定刷新时间间隔,默认为3秒
-b: 全部显示所有进程
-n #: 刷新多少次后退出
[root@centos6 ~]#top
top - 11:02:49 up 2:50, 4 users, load average: 0.00, 0.00, 0.00
Tasks: 156 total, 1 running, 155 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1004112k total, 210440k used, 793672k free, 9580k buffers
Swap: 4194300k total, 0k used, 4194300k free, 55164k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19236 1496 1228 S 0.0 0.1 0:01.43 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0
7 root RT 0 0 0 0 S 0.0 0.0 0:00.01 migration/1
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/1
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1
10 root RT 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/1
11 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/2
栏位信息简介
us:用户空间;sy:内核空间;ni:调整nice时间;id:空闲;wa:等待IO时间;hi:硬中断;si:软中断(模式切换);st:虚拟机偷走的时间
内置命令
排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+
首部信息显示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分别显示:1 (数字)
memory信息:m命令
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W
查找帮助信息:h
11、vmstat命令
[root@centos6 yum.repos.d]#vmstat ---显示虚拟内存信息
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 710432 12100 135420 0 0 3 1 9 5 0 0 100 0 0
[root@centos6 yum.repos.d]#vmstat 5 10 ---表示5秒显示一次,显示10次
swap:
si:从磁盘交换进内存的数据速率(kb/s),从交换分区到进内存,
so:从内存交换至磁盘的数据速率(kb/s),从内存出到swap分区,因swap在磁盘上,所以是从内存到磁盘
io:
bi:从块设备读入数据到系统的速率(kb/s),从块设备读入数据写到内存
bo: 保存数据至块设备的速率,从内存读数据写到块设备
12、iostat命令
统计CPU和设备IO信息
[root@centos6 yum.repos.d]#iostat
Linux 2.6.32-696.el6.x86_64 (centos6.9.magedu.com) 08/22/2017 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.06 0.00 0.28 0.03 0.00 99.63
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
scd0 0.03 0.17 0.00 3628 0
sda 10.08 1768.54 319.54 37974826 6861312
[root@centos6 yum.repos.d]#iostat sda
只统计某个磁盘[root@centos6 yum.repos.d]#iostat 1 10
表示1秒显示一次,显示10次
13、用glances命令监控远程主机
服务器模式:
glances -s -B IPADDR
IPADDR: 指明监听的本机哪个地址,也可以不用-B指监听本地的所有IP地址。
客户端模式:
glances -c IPADDR
IPADDR:要连入的服务器端地址
实例
centos7做为服务器,centos6做为客户端,并且两台机器都安装了glances
[root@redhat7 yum.repos.d]#glances -s ---指明glances服务已经打开,端口是61209,可以监听本地的所有ip地址
Glances server is running on 0.0.0.0:61209
[root@redhat7 yum.repos.d]#glances -s -B 172.18.21.7
-B指明监控本地的172.18.21.7的ip地址
Glances server is running on 172.18.21.7:61209
[root@centos6 yum.repos.d]#glances -c 172.18.21.7 ---在客户端指明要监控远程主机的哪个ip地址,就可以远程监控别的主机了
14、dstat命令
系统资源统计,代替vmstat,iostat
-c: 显示cpu相关信息
-C #,#,...,total
-d: 显示disk相关信息
-D total,sda,sdb,...
-g:显示page相关统计数据
-m: 显示memory相关统计数据
-n: 显示network相关统计数据
-p: 显示process相关统计数据
-r: 显示io请求相关的统计数据
-s: 显示swapped相关的统计数据
--tcp
--udp
--unix
--raw
--socket
--ipc
--top-cpu:显示最占用CPU的进程
--top-io: 显示最占用io的进程
--top-mem: 显示最占用内存的进程
--top-latency: 显示延迟最大的进程
15、kill命令
向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头(可省略),不区分大小写
显示当前系统可用信号:kill –l,trap-l
常用信号:man 7 signal
- SIGHUP: 无须关闭进程而让其重读配置文件
- SIGINT: 中止正在运行的进程;相当于Ctrl+c
- SIGQUIT:相当于ctrl+=quit
- SIGKILL: 强制杀死正在运行的进程
- SIGTERM:终止正在运行的进程
- SIGCONT:继续运行
- SIGSTOP:后台休眠
指定信号的方法:
(1) 信号的数字标识:1, 2, 9
(2) 信号完整名称:SIGHUP(3) 信号的简写名称:HUP
以下三种形式都可以
[root@centos6 app]#kill -1 4691
[root@centos6 app]#kill -HUP 3915
[root@centos6 app]#kill -SIGHUP 3915
[root@centos6 app]#kill -0 4691 &>/dev/null ||service httpd restart
发零信号可以监控某个程序是否正常运行,但这种方法要知道进程编号,如果程序退出进程编号可能发生改变
[root@centos6 app]#killall -0 httpd &>/dev/null ||service httpd restart
killall 后面可以给跟名称
按模式:pkill[options] pattern
-SIGNAL
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名(pgrep可用)
-a: 显示完整格式的进程名(pgrep可用)
-P pid: 显示指定进程的子进程
[root@centos6 app]#pkill -9 -u dufu ---强制杀死dufu这个用户的所有进程
16、作业管理
[root@centos6 ~]#ping 172.8.0.1 & ---表示直接后台运行
[root@centos6 ~]#ping 172.18.0.1 ---按ctrl+z ping程序进入后台休眠
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.535 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.453 ms
64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=0.407 ms
^Z
[1]+ Stopped ping 172.18.0.1
[root@centos6 ~]#sleep 100 ---按ctrl+z sleep进程进入后台休眠
^Z
[2]+ Stopped sleep 100
[root@centos6 ~]#jobs ---查看当前终端所有作业,注意每个进程的前面的号码,用于转入后台运行和后台休眠时用
[1]- Stopped ping 172.18.0.1
[2]+ Stopped sleep 100
[root@centos6 ~]#bg 2 ---将sleep进程转入后台运行,因sleep的jobs号码是2,所以bg 后面加2,bg为background后台的简写
[2]+ sleep 100 &
[root@centos6 ~]#jobs ---只能看当前这个终端,不能在其他终端里看
[1]+ Stopped ping 172.18.0.1
[2]- Running sleep 100 &
其中用killall 或者kill命令发信号时,可以在其他终端进行,发19信号是由后台运行转为后台休眠,发18信号是由后台休眠转为后台运行
17 断网恢复后仍可以在后台运行
之前学过的方法是用screen可以将断网后的进程恢复,先输入screen,然后运行进程,断网后,输入screen -ls查看一下,再输入screen -r 就可以恢复,下面是一种新的方法。
[root@centos6 ~]#nohup ping 172.18.0.1&>/dev/null & ---使用nohup并且后台执行
[1] 4737
[root@centos6 ~]#jobs
[1]+ Running nohup ping 172.18.0.1 &>/dev/null &
断网后恢复
[root@centos6 ~]#pstree -p ---查看进程树,发现仍然在运行
init(1)─┬─atd(1681)
├─auditd(1424)───{auditd}(1425)
├─automount(1505)─┬─{automount}(1506)
│ ├─{automount}(1507)
│ ├─{automount}(1522)
│ └─{automount}(1525)
├─crond(1666)
├─dhclient(1367)
├─master(1652)───qmgr(1659)
├─mingetty(1694)
├─mingetty(1696)
├─mingetty(1698)
├─mingetty(1700)
├─mingetty(1702)
├─mingetty(1704)
├─ping(4737) ---仍然在运行
├─rsyslogd(1446)─┬─{rsyslogd}(1447)
│ ├─{rsyslogd}(1448)
│ └─{rsyslogd}(1449)
├─sshd(1573)─┬─sshd(4691)───bash(4696)
│ └─sshd(4742)───bash(4747)───pstree(4766)
└─udevd(576)─┬─udevd(1711)
└─udevd(1712)
[root@centos6 ~]#ps aux|grep ping ---搜索也可以搜到
root 4737 0.0 0.0 103268 740 ? S 19:53 0:00 ping 172.18.0.1
root 4769 0.0 0.0 103328 880 pts/0 S+ 19:55 0:00 grep ping
[root@centos6 ~]#killall ping ---杀死进程
[root@centos6 ~]#ps aux|grep ping
root 4815 0.0 0.0 103328 880 pts/0 S+ 20:00 0:00 grep ping
[root@centos6 ~]#nohup ping 172.18.0.1 ---使用nohup并且前台执行
断网后恢复
[root@centos6 ~]#ps aux |grep ping ---发现仍然在运行
root 4872 0.0 0.0 103268 740 ? S 20:07 0:00 ping 172.18.0.1
root 4897 0.0 0.0 103328 880 pts/0 S+ 20:08 0:00 grep ping
[root@centos6 ~]#pstree -p
init(1)─┬─atd(1681)
├─auditd(1424)───{auditd}(1425)
├─automount(1505)─┬─{automount}(1506)
│ ├─{automount}(1507)
│ ├─{automount}(1522)
│ └─{automount}(1525)
├─crond(1666)
├─dhclient(1367)
├─master(1652)─┬─pickup(4767)
│ └─qmgr(1659)
├─mingetty(1694)
├─mingetty(1696)
├─mingetty(1698)
├─mingetty(1700)
├─mingetty(1702)
├─mingetty(1704)
├─ping(4872) ---进程树发现也在运行
├─rsyslogd(1446)─┬─{rsyslogd}(1447)
│ ├─{rsyslogd}(1448)
│ └─{rsyslogd}(1449)
├─sshd(1573)─┬─sshd(4691)───bash(4696)
│ └─sshd(4873)───bash(4877)───pstree(4898)
└─udevd(576)─┬─udevd(1711)
└─udevd(1712)
采用此种方法,将正在前台运行的进程或者正在后台运行的进程,断网后,恢复网络进程仍然在后台正在进行,直到运行结束进程才会终止。
18、kill命令终止后台正在运行的进程和后台休眠的进程
[root@centos6 ~]#ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.494 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.486 ms
64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=0.481 ms
^Z[1] Terminated ping 172.18.0.1 ---ctrl +z 转为后台休眠
[2]+ Stopped ping 172.18.0.1
[root@centos6 ~]#jobs
[2]+ Stopped ping 172.18.0.1
[root@centos6 ~]#kill %2 ---2是jobs的编号
[2]+ Stopped ping 172.18.0.1
[root@centos6 ~]#jobs ---显示已经终止
[2]+ Terminated ping 172.18.0.1
[root@centos6 ~]#ps aux |grep ping ---查看进程已经查不到了
root 4867 0.0 0.0 103328 884 pts/0 S+ 20:05 0:00 grep ping
对于后台正在运行的进程,此种方法也可以使用,先用jobs查一下编号,然后用kill %jobnum 就可以终止在后台运行的进程,此种方法必须在同一个终端,因为jobs只能显示在本终端的作业。
19 centos6和centos7断网后的区别
[root@centos6 ~]#ping 172.18.0.1&
断网后恢复
[root@centos6 ~]#ps aux|grep ping ---发现仍然在后台运行
root 4958 0.0 0.0 103268 744 ? S 20:20 0:00 ping 172.18.0.1
root 4985 0.0 0.0 103328 884 pts/2 S+ 20:21 0:00 grep ping
[root@centos6 ~]#pstree -p
init(1)─┬─atd(1681)
├─auditd(1424)───{auditd}(1425)
├─automount(1505)─┬─{automount}(1506)
│ ├─{automount}(1507)
│ ├─{automount}(1522)
│ └─{automount}(1525)
├─crond(1666)
├─dhclient(1367)
├─master(1652)─┬─pickup(4767)
│ └─qmgr(1659)
├─mingetty(1694)
├─mingetty(1696)
├─mingetty(1698)
├─mingetty(1700)
├─mingetty(1702)
├─mingetty(1704)
├─ping(4958) ---发现进程仍然在进行
├─rsyslogd(1446)─┬─{rsyslogd}(1447)
│ ├─{rsyslogd}(1448)
│ └─{rsyslogd}(1449)
├─sshd(1573)─┬─sshd(4691)───bash(4696)
│ └─sshd(4960)───bash(4964)───pstree(4988)
└─udevd(576)─┬─udevd(1711)
└─udevd(1712)
[root@redhat7 app]#ping 172.18.0.1&
断网后恢复
[root@redhat7 ~]#ps aux |grep ping --发现已经查不到了
root 5684 0.0 0.0 112660 972 pts/0 S+ 20:21 0:00 grep --color=auto ping
总结:centos6中后台运行的进程即使断网了恢复后仍然在后台运行,但centos7却不可以。