16-进程管理

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 1012 00:03 Books
drwxrwxr-x 12 xiang xiang 4.0K 1012 17:54 Class
drwxrwxr-x  7 xiang xiang 4.0K  927 23:58 Codes
drwxrwxr-x  9 xiang xiang 4.0K 1013 23:24 Notes
drwx------ 10 xiang xiang 4.0K  99 16:06 Official
drwx------  6 xiang xiang 4.0K  921 17:19 Plan
drwxrwxr-x  2 xiang xiang 4.0K 1010 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 -lS相同(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 进程的管理

代号名称内容
1SIGHUP让该PID重新读取自己的配置文件,重新启动
2SIGINT中断进程,相当于Ctrl+C
9SIGKILL强制结束进程。若该进程未完成,可能有垃圾产生
15SIGTERM正常结束进程。若该进程已发生问题,无法用正常的方法终止时,发送该signal也没用
19SIGSTOP暂停进程,相当于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值:
    1. 执行程序时用nice指令设定nice值。
    2. 用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值