Please indicate the source: http://blog.csdn.net/gaoxiangnumber1
Welcome to my github: https://github.com/gaoxiangnumber1
16.1什么是进程process
16.1.1进程与程序process&program
- 程序program:通常为binary file,存放在存储媒体中(如硬盘、光盘等);
进程process:进程是一个正在执行的程序,操作系统给予进程一个标识符PID。系统通过PID判断该process是否具有权限进行相应工作。
系统或网络服务:常驻内存的进程
- 常驻内存的进程被称为daemon。系统服务分成系统本身需要的服务和网络服务。网络服务对应的程序被执行后,会启动网络监听的端口port,以提供客户端的连接要求。
- 一般daemon类型的程序都会加上d在文件名后头,如httpd。
16.1.2 Linux的多人多任务环境
多重登入环境的七个基本终端窗口
- Linux默认提供六个文字界面登入窗口和一个图形界面,使用[alt]+[F1]…[F7]切换终端机界面。每个终端机界面的登入者可以不同。Linux默认启动六个终端机登入环境的程序。
16.2工作管理(job control)
16.2.1什么是工作管理
- 管理的进程必须来自自己shell的子进程。
- 前景:可以控制与下达指令的环境foreground。
- 背景:可以自动执行的工作,不能与用户交互、无法使用Ctrl+c终止,可使用bg/fg呼叫该工作。
16.2.2 job control的管理
直接将指令丢到背景中执行&
$ ll Gao/ &
[1] 5776
xiang :~ $ total 28K
drwx------ 8 xiang xiang 4.0K 10月 12 00:03 Books
drwxrwxr-x 12 xiang xiang 4.0K 10月 12 17:54 Class
drwxrwxr-x 7 xiang xiang 4.0K 9月 27 23:58 Codes
drwxrwxr-x 9 xiang xiang 4.0K 10月 13 23:24 Notes
drwx------ 10 xiang xiang 4.0K 9月 9 16:06 Official
drwx------ 6 xiang xiang 4.0K 9月 21 17:19 Plan
drwxrwxr-x 2 xiang xiang 4.0K 10月 10 19:59 TopOffer
[1]+ Done ls -h --color=auto -l Gao/
xiang :~ $
- 中括号内的号码为工作号码job X;后一个数字为该工作的PID;后续是指令的数据流,因为本例没有数据流重导向。
最后一行:代表[1]工作已完成,该工作的指令是后面一串指令列。
Ctrl+z将目前的工作丢到背景中暂停
xiang :~ $ gedit power.c
^Z
[1]+ Stopped gedit power.c
- [1]表示这是第一个工作,+代表最近一个被丢进背景的工作,且目前在背景下默认会被读取的那个工作。Stopped代表目前工作的状态。
jobs观察目前的背景工作状态
jobs [-lrs]
- -l 列出job X、指令串、PID
-r 仅列出正在背景run的工作
-s 仅列出正在背景stop的工作
xiang :~ $ codeblocks &> /dev/null &
[1] 7566
xiang :~ $ gedit &> /dev/null &
[2] 7931
xiang :~ $ google-chrome &> /dev/null &
[3] 7945
xiang :~ $ wps &> /dev/null &
[4] 8144
xiang :~ $ et &> /dev/null &
[5] 8152
xiang :~ $ jobs -l
[1] 7566 Running codeblocks &> /dev/null &
[2] 7931 Running gedit &> /dev/null &
[3] 7945 Running google-chrome &> /dev/null &
[4]- 8144 Running wps &> /dev/null &
[5]+ 8152 Running et &> /dev/null &
xiang :~ $ okular &> /dev/null &
[6] 8207
xiang :~ $ jobs -l
[1] 7566 Running codeblocks &> /dev/null &
[2] 7931 Running gedit &> /dev/null &
[3] 7945 Running google-chrome &> /dev/null &
[4] 8144 Running wps &> /dev/null &
[5]- 8152 Running et &> /dev/null &
[6]+ 8207 Running okular &> /dev/null &
- +代表最近第一个被放到背景的工作号码,-代表最近第二个被放到背景的工作号码。超过最后第二个以后的工作没有+/-。
+是输入fg时默认读取的工作。
fg将背景工作拿到前景来处理
fg %job_number
- job_number为工作号码。
%
是可有可无。
xiang :~ $ jobs -l
[1]- 9608 Running wps &> /dev/null &
[2]+ 9621 Running et &> /dev/null &
xiang :~ $ fg #默认取出+的工作,即[2]
et &> /dev/null
^Z
[2]+ Stopped et &> /dev/null
xiang :~ $ jobs -l
[1]- 9608 Running wps &> /dev/null &
[2]+ 9621 Stopped et &> /dev/null
xiang :~ $ fg %1 #直接规定取出的工作号码
wps &> /dev/null
^Z
[1]+ Stopped wps &> /dev/null
xiang :~ $ jobs #+-号互换
[1]+ Stopped wps &> /dev/null
[2]- Stopped et &> /dev/null
xiang :~ $ fg - #取出-号的工作号码
et &> /dev/null
^Z
[2]+ Stopped et &> /dev/null
xiang :~ $ jobs -l #+-号互换
[1]- 9608 Stopped wps &> /dev/null
[2]+ 9621 Stopped et &> /dev/null
bg让在背景工作的状态变成执行中
xiang :~ $ okular &> /dev/null
^Z
[3]+ Stopped okular &> /dev/null
xiang :~ $ jobs -l
[1] 9608 Stopped wps &> /dev/null
[2]- 9621 Stopped et &> /dev/null
[3]+ 9677 Stopped okular &> /dev/null
xiang :~ $ bg %3 #让该工作在背景下执行
[3]+ okular &> /dev/null &
xiang :~ $ jobs -l
[1]- 9608 Stopped wps &> /dev/null
[2]+ 9621 Stopped et &> /dev/null
[3] 9677 Running okular &> /dev/null &
#由Stopped变成Running;指令最后多了一个&,代表该工作被启动在背景中
kill管理背景当中的工作
kill -signal %job_number
kill -l
-l
列出目前kill能用的信号。signal
代表给后面接的工作什么信号。
man 7 signal:
-1 重新读取参数的配置文件reload
-2 中断信号
-9 强制终止
-15 以正常方式终止。15是默认值
xiang :~ $ jobs
[1]- Stopped wps &> /dev/null
[2]+ Stopped et &> /dev/null
[3] Running okular &> /dev/null &
xiang :~ $ kill -9 %3
xiang :~ $ jobs
[1]- Stopped wps &> /dev/null
[2]+ Stopped et &> /dev/null
[3] Killed okular &> /dev/null
xiang :~ $ jobs #3号工作被移除
[1]- Stopped wps &> /dev/null
[2]+ Stopped et &> /dev/null
xiang :~ $ kill -SIGTERM %1 #正常终止工作1。-SIGTERM同-15
xiang :~ $ jobs
[1]- Terminated wps &> /dev/null
[2]+ Stopped et &> /dev/null
xiang :~ $ jobs
[2]+ Stopped et &> /dev/null
- kill接的数字默认是PID,加上
%
才能接工作数字。
16.2.3脱机管理问题
16.3进程管理
16.3.1进程的观察
ps将某个时间点的进程执行情况撷取下来
ps aux #观察系统所有进程的数据
ps -lA #同上
ps axjf #连同部分进程树状态
- -A 显示所有的process,同-e
-a 显示不与terminal有关的所有process
-u 显示有效用户effective user相关的process
x 通常与参数a一起使用,可列出较完整信息 - 输出格式规划:
l 详细列出PID的信息
j 工作的格式jobs format
-f 完整的输出。 - 常用:
ps -l只能查阅自己bash进程
ps aux可以查阅所有系统执行进程
xiang :~ $ ps -l #仅观察自己bash相关进程
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 9589 9583 0 80 0 - 7291 wait pts/3 00:00:00 bash
0 T 1000 9621 9589 0 80 0 - 4592 signal pts/3 00:00:00 et
0 T 1000 9623 9621 0 80 0 - 480171 signal pts/3 00:00:04 et
0 R 1000 9885 9589 0 80 0 - 3979 - pts/3 00:00:00 ps
ps -l
仅列出自己bash有关的进程,即最上层的父进程是自己的bash,没有延伸到systemd进程。- F:process flags代表该进程的权限。4表示此进程权限为root;1表示此子进程仅fork没有exec。
- S:代表该进程的状态。R正在执行;S正在睡眠,但能被signal唤醒;D不可被唤醒的睡眠状态,通常在等待I/O;T停止状态,可能是在工作控制(背景暂停)或除错状态;Z僵尸状态Zombie,进程已终止却无法移出内存。
- UID/PID/PPID:代表此进程被UID拥有;此进程的PID;此进程父进程的PID。
- C:CPU使用率,单位为百分比。
- PRI/NI:Priority/Nice的缩写,代表此进程被CPU执行的优先级,数值越小代表该进程越快被CPU执行。
- ADDR/SZ/WCHAN:ADDR是kernel function,指出该进程在内存的哪个部分,若进程在running,显示
-
;SZ代表此进程占用的内存;WCHAN表示目前进程是否正在执行,-
表示正在执行。 - TTY:登入者终端机的位置。若为远程登录则使用动态终端接口(pts/n)。
- TIME:此进程实际使用CPU执行的时间,不是系统时间。
- CMD:command缩写,执行该进程的指令。
ps aux观察系统所有进程
$ ps aux #按照PID的顺序显示
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 33768 4428 ? Ss 08:09 0:02 /sbin/init
root 2 0.0 0.0 0 0 ? S 08:09 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 08:09 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 08:09 0:03 [rcu_sched]
- USER 该进程属于的用户账号
PID 进程标识符
%CPU 使用的CPU资源百分比
%MEM 使用的物理内存百分比
VSZ 使用的虚拟内存量KB
RSS 使用的固定内存量KB
TTY 在哪个终端机上执行。?
代表与终端机无关,tty1-tty6是本机的
登入者进程,pts/0等表示由网络连接主机的进程
STAT 目前状态,与ps -l
的S
相同(R/S/T/Z)
START 被执行启动的时间
TIME 实际使用CPU执行的时间
COMMAND 执行该进程的指令 - 造成僵尸进程的原因是该进程已执行完,或因故终止,但父进程却无法将该进程结束,造成该进程一直在内存中。进程的CMD后面有代表该进程是僵尸进程。通常僵尸进程是交给systemd负责;systemd是系统第一个进程,是所有进程的父进程,无法终止掉(终止掉它,系统就死掉)。
top动态观察进程的变化
top [-d 数字] | top [-bnp]
- -d 后接进程画面更新的秒数,默认5秒
-b 批次执行top,通常搭配数据流重导向将批次的结果输出为文件
-n 与-b搭配,代表进行几次top
-p 指定某些PID进行观察
top -b -n 2 > /tmp/top.txt #进行2次top,将结果输出到/tmp/top.txt
top -p your_pid #只观察your_pid进程
- top执行中可以使用指令:
? 显示在top中可以输入的指令
P 以CPU使用排序显示
M 以Memory使用排序显示
N 以PID排序
T 以进程使用CPU的累积时间TIME+排序
k 给某个PID信号
r 给某个PID设定nice值,非root只能增加nice值,即降低优先级
q 退出top
xiang :~ $ top
top - 13:42:18 up 5:33, 2 users, load average: 0.04, 0.12, 0.13
Tasks: 246 total, 1 running, 245 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.4 us, 0.2 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 8104964 total, 6358952 used, 1746012 free, 194244 buffers
KiB Swap: 8315900 total, 160 used, 8315740 free. 2328936 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8261 xiang 20 0 3538156 1.154g 1.096g S 3.0 14.9 9:00.92 VirtualBox
14 root 20 0 0 0 0 S 1.0 0.0 0:00.92 rcuos/6
1283 root 20 0 797880 173128 144288 S 1.0 2.1 5:02.58 Xorg
2194 xiang 20 0 1230928 102604 60628 S 1.0 1.3 4:24.79 compiz
1 root 20 0 33768 4428 2764 S 0.0 0.1 0:02.31 init ```
- top分为两个画面。上面为系统资源使用状态,共六行,显示的内容依序是:
1. 目前的时间13:42:18、开机时间up 5:33、登入系统的用户人数2 users、系统在1/5/15分钟的平均工作负载(即1/5/15分钟,系统平均要负责执行几个进程)
2. 目前进程总量、个别进程的状态running/sleeping/stopped/zombie。
3. CPU整体负载,每个项目可用?查阅。wa代表I/O wait。对多核设备,按1切换不同CPU的负载率。
4. 目前物理内存Mem的使用情况。
5. 目前虚拟内存Swap的使用情况。swap用的量大表示物理内存不足。
6. 在top中输入指令时,显示状态的地方。
- top下半部分是每个process使用资源的情况:
PID process-ID
USER 拥有进程的用户
PR Priority进程的优先执行顺序,越小越早被执行
NI Nice,越小越早被执行
%CPU CPU使用率
%MEM 内存使用率
TIME+ CPU累计使用时间
pstree
pstree [-A|U] [-up]
- -A 进程树间以ASCII字符连接
-U 进程树间以万国码字符连接。在某些终端下可能会有错误
-p 并同时列出每个process的PID
-u 并同时列出每个process所属的账号名
$ pstree -A
init-+-ModemManager---2*[{ModemManager}]#ModemManager与其子进程
|-NetworkManager---3*[{NetworkManager}]#数字代表子进程的数量
|-accounts-daemon---2*[{accounts-daemon}]
...
|-gnome-terminal-+-bash---pstree#本指令执行的相依性
...
$ pstree -Aup
#()内是PID及该进程的owner。owner与父进程不同才会列出。
#1829转变成xiang
init(1)-+-ModemManager(815)-+-{ModemManager}(828)
| `-{ModemManager}(832)
|-NetworkManager(848)-+-{NetworkManager}(849)
| |-{NetworkManager}(855)
| `-{NetworkManager}(858)
...
|-gnome-keyring-d(1829,xiang)-+-{gnome-keyring-d}(1830)
...
- init进程PID是1,它是Linux核心主动呼叫的第一支程序。
16.3.2 进程的管理
代号 | 名称 | 内容 |
---|---|---|
1 | SIGHUP | 让该PID重新读取自己的配置文件,重新启动 |
2 | SIGINT | 中断进程,相当于Ctrl+C |
9 | SIGKILL | 强制结束进程。若该进程未完成,可能有垃圾产生 |
15 | SIGTERM | 正常结束进程。若该进程已发生问题,无法用正常的方法终止时,发送该signal也没用 |
19 | SIGSTOP | 暂停进程,相当于Ctrl+Z |
kill -signal PID
- kill能将signal传送给某个工作(%job_number)或某个PID(直接输入数字)。
killall -signal 指令名称
killall [-iIe] [command name]
- killall可以将系统中所有以某个指令名称启动的进程全部删除。
-i interactive,需要删除时会出现提示字符
-e exact,接的command name要一致。整个完整指令不能超过15个字符
-I 指令名称(可能含参数)忽略大小写
$ killall -9 httpd #强制终止所有以httpd启动的进程
$ killall -i -9 bash #依次询问每个bash程序是否需要被终止
Signal bash(13888) ?(y/N) n #不终止
Signal bash(14836) ?(y/N) y #终止
16.3.3 关于进程的执行顺序
Priority与Nice
- Linux给进程PRI值,越低越优先。PRI值由kernel动态调整,用户无法调整。
- 用户可通过Nice值调整进程优先执行顺序。一般来说,
PRI_new = PRI_old + nice
最终的PRI是经过系统分析后决定的,不一定吻合上式。
root可随意调整自己或它人进程的Nice值,范围为-20-19;一般用户仅可调整自己进程的Nice值,范围为0-19。 - 两种方式给予某个进程nice值:
- 执行程序时用nice指令设定nice值。
- 用renice指令调整某个已存在PID的nice值。
nice新执行的指令即给予新的nice值
nice [-n 数字] command
- -n后接数值,范围-20-19。
root :~ # nice -n -10 gedit &
[1] 9840
root :~ # ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 9824 9812 0 80 0 - 19327 poll_s pts/1 00:00:00 sudo
4 S 0 9826 9824 0 80 0 - 7252 wait pts/1 00:00:00 bash
4 S 0 9840 9826 3 70 -10 - 175859 poll_s pts/1 00:00:00 gedit
0 R 0 9893 9826 0 80 0 - 3979 - pts/1 00:00:00 ps
renice已存在进程的nice重新调整
renice [X] PID
xiang :~ $ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 9812 9806 0 80 0 - 7262 wait pts/1 00:00:00 bash
0 R 1000 9910 9812 0 80 0 - 3979 - pts/1 00:00:00 ps
xiang :~ $ renice 5 $$
9812 (process ID) old priority 0, new priority 5
xiang :~ $ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 9812 9806 0 85 5 - 7262 wait pts/1 00:00:00 bash
0 R 1000 9913 9812 0 85 5 - 3979 - pts/1 00:00:00 ps
- 虽然修改的是bash进程,但是该进程所执行的ps指令的nice也会继承而为5。整个nice值是可以在父进程->子进程传递。top也可以调整nice值。
16.3.4 系统资源的观察
free观察内存使用情况
free [-b|-k|-m|-g|-h] [-t] [-s X -c Y]
- -b 只输入free显示的单位是KB。b-B、m-MB、k-KB、g-GB
-h 让系统自己指定单位
-t 显示物理内存与swap的总量
-s 每X秒钟输出一次
-c 配合-s,让free列出Y次
uname查阅系统与核心相关信息
uname [-asrmpi]
- -a 所有系统相关的信息,包括下面的数据
-s 系统核心名称
-r 核心版本
-m 系统硬件名称
-p CPU类型
-i 硬件平台
uptime观察系统启动时间与工作负载
- 显示系统已开机时间,及1/5/15分钟的平均负载。
netstat追踪网络或插槽文件
netstat -[atunlp]
- -a 列出系统上所有的连接、监听、Socket数据
-t 列出tcp网络包的数据
-u 列出udp网络包的数据
-n 不以进程的服务名称,以port X来显示
-l 列出正在listen的服务
-p 列出该网络服务进程的PID
$ netstat
Active Internet connections (w/o servers)#与网络相关的部分
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp6 1 0 ip6-localhost:47099 ip6-localhost:ipp CLOSE_WAIT
Active UNIX domain sockets (w/o servers)#与本机进程的相关性(非网络)
Proto RefCnt Flags Type State I-Node Path
unix 17 [ ] DGRAM 7922 /dev/log
unix 3 [ ] STREAM CONNECTED 15419 /var/run/acpid.socket
unix 3 [ ] STREAM CONNECTED 13563 /var/run/dbus/system_bus_socket
unix 3 [ ] STREAM CONNECTED 18464 @/tmp/dbus-woSbIp0voY
unix 3 [ ] STREAM CONNECTED 12158
unix 3 [ ] STREAM CONNECTED 10765
- 结果显示两个部分:网络连接、Linux的socket 进程相关性。
- Proto 网络的封包协议,主要为TCP与UDP
Recv-Q 非由用户程序连接到此socket的复制的总bytes数
Send-Q 非由远程主机传送的acknowledged总bytes数
Local Address 本地端IP:port
Foreign Address 远程主机IP:port
State 连接状态,主要有ESTABLISED、LISTEN - 进程可以通过socket接收其他进程发送的信息。socket file的输出字段有:
Proto 一般是unix
RefCnt 连接到此socket的进程数量
Flags 连接的标志
Type socket存取类型。确认连接的STREAM;不需确认的DGRAM
State CONNECTED表示多个进程间已建立连接
Path 连接到此socket的相关程序的路径,或是相关数据输出的路径
Please indicate the source: http://blog.csdn.net/gaoxiangnumber1
Welcome to my github: https://github.com/gaoxiangnumber1