Linux进程与作业管理

时间:2020-12-14 21:51:18

     大家有没有想过,如果我们的linux的整个系统资源快要被耗尽的时候,我们能否找到最耗尽系统资源的那个进程,然后删除该进程,让系统恢复正常呢?由于某个程序存在bug,产生一系列问题,我们如何找到它并结束该进程?又或者让非常重要的程序先运行?等等所有的这些都需要对进程进行管理。进程管理的工具有:pstree , ps , pidof , pgrep , top, htop, glances, pmap, vmstat, dstat, kill, pkill, job,bg, fg, nohup, nice , renice , killall ,..

首先知道几个概念:

进程:运行中程序的一个副本。进程存在生命周期

程序:一个静态的二进制文件

守护进程:在系统引导过程中启动的进程,与终端无关

用户进程:通过终端打开的进程,前台进程,与终端相关

进程的优先级:0-139   

1-99:实时优先级,数字越大,优先级越高

100-139:静态优先级,数字越小,优先级越高

调整优先级用nice:-20~19

新的优先级=旧+nice

一、进程

ps:显示系统当前进程的运行情况

选项与参数

-A:  显示所有的进程与-e等效

-a:   显示所有与终端有关的进程

-x:   与a共同使用,列出较完整信息

-u:   与用户相关的进程

-e:  显示所有进程

-f:   显示完整格式的进程信息

-H:  以层次结构显示进程的相关信息

常用组合方式:

1.ps    aux

[root@localhost ~]# ps axu
 USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 root          1  0.0  0.5 193864  5108 ?        Ss   10:35   0:11 /usr/lib/systemd/systemd --swi
 root          2  0.0  0.0      0     0 ?        S    10:35   0:00 [kthreadd]

2.ps    -ef

[root@localhost ~]# ps -ef
 UID         PID   PPID  C STIME TTY          TIME CMD
 root          1      0  0 10:35 ?        00:00:11 /usr/lib/systemd/systemd --switched-root --sys
 root          2      0  0 10:35 ?        00:00:00 [kthreadd]
 root          3      2  0 10:35 ?        00:00:02 [ksoftirqd/0]
 root          5      2  0 10:35 ?        00:00:00 [kworker/0:0H]
 root          7      2  0 10:35 ?        00:00:00 [migration/0]
 root          8      2  0 10:35 ?        00:00:00 [rcu_bh]

3.ps     axo:自定义的显示信息

[root@localhost ~]# ps axo command,%cpu,%mem
 COMMAND                     %CPU %MEM
 /usr/lib/systemd/systemd --  0.0  0.5
 [kthreadd]                   0.0  0.0
 [ksoftirqd/0]                0.0  0.0
 [kworker/0:0H]               0.0  0.0
 [migration/0]                0.0  0.0

pgrep命令:只显示指定的进程信息,用grep来检索

-U  UID:显示用指定用户身份运行的进程

-G  GID:显示用指定用户组运行的进程

-l  命令:显示PID 和进程名

[root@localhost ~]# pgrep -l sleep
 8149 sleep

pidof命令:显示指定命令所启动的进程id

[root@localhost ~]# pidof sleep
 8126

相对于ps而言,ps显示的是某个时间点的进程状态信息,然而在实际运用当中,需要动态的实时监控进程的运行状态,这就需要用top来实现 。

top
     P 按cpu占用率排序
     M 按mem占用率排序
     s 修改刷新间隔
     k 杀死指定进程

uptime:相当于top的第一行

[root@localhost ~]# uptime 
  17:18:02 up  6:42,  3 users,  load average: 0.00, 0.01, 0.05

vmstat [M] [N] 
     M 表示刷新间隔时间
     N 表示刷新次数 ,若不指定,则一直刷新,直到手动停止ctrl+c

[root@localhost ~]# vmstat 1 3
 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
  1  0 425216 105412     40 317872    2    9   133    31   69   57  0  0 98  1  0
  0  0 425216 105412     40 317872    0    0     0     0  105   85  0  0 100  0  0
  0  0 425216 105412     40 317872    0    0     0     0   84   77  0  0 100  0  0

kill

以上我们讲了进程查看、资源的获取等命令,接着探讨进程的管理。进程管理就是向进程发送控制信号。通过kill命令显示当前系统可用的信号,并向进程发送

kill     -l      显示当前系统可用的信号

        -1      通过进程重读配置文件  (不是所有服务都支持) vsftpd
        -2      中断进程 
       -15     正常退出一个进程,通知进程,正常结束  (默认)
        -9      强制杀死一个进程

[root@localhost ~]# kill -l
  1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
  6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
 11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM


[root@localhost ~]# ps -ef|grep ping
 root       2349   1939  0 10:39 ?        00:00:01 /usr/libexec/gsd-housekeeping
 root       8271   8229  0 17:21 pts/1    00:00:00 ping 172.18.0.1
 root       8273   7949  0 17:21 pts/2    00:00:00 grep --color=auto ping


 [root@localhost ~]# kill -2 8271
 [root@localhost ~]# ps -ef|grep ping
 root       2349   1939  0 10:39 ?        00:00:01 /usr/libexec/gsd-housekeeping
 root       8289   7949  0 17:22 pts/2    00:00:00 grep --color=auto ping


[root@localhost ~]# kill -9 8343

[root@localhost ~]# pidof sleep
 [root@localhost ~]# 

作业管理

  • job : 作业

    foreground(前台作业) :通过终端启动,且启动后会一直占用终端(命令提示符)。

    background(后台作业):可以通过终端启动,但启动后即转入后台运行(释放终端)。

64 bytes from 172.18.0.1: icmp_seq=13 ttl=64 time=0.862 ms
 ^Z
 [1]+  Stopped                 ping 172.18.0.1
 [root@localhost ~]# jobs
 [1]+  Stopped                 ping 172.18.0.1
 [root@localhost ~]# fg
 ping 172.18.0.1
 64 bytes from 172.18.0.1: icmp_seq=14 ttl=64 time=3.72 ms
 64 bytes from 172.18.0.1: icmp_seq=15 ttl=64 time=0.936 ms
 64 bytes from 172.18.0.1: icmp_seq=16 ttl=64 time=0.899 ms

如何让作业于后台运行:

  • a. 运行中的作业:

      执行命令 : ctrl + z ;

     注意: 送往后台的作业会转为停止状态(stop)。

  • b . 尚未启动的作业: COMMAND & ;在启动的作业后面 + &
[root@localhost website]# (sleep 10000s &)
 [root@localhost website]# pstree -p|grep sleep
            |-ksmtuned(770)---sleep(7396)
            |-sleep(7398)

[root@localhost website]# ps -ef|grep sleep
 root       7398      1  0 16:32 pts/2    00:00:00 sleep 10000s

[c:\~]$ 

Connecting to 172.18.250.55:22...
 Connection established.
 To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Sat Aug 25 16:28:07 2018 from 172.18.250.74
 [root@localhost ~]# ps -ef|grep sleep
 root       7398      1  0 16:32 ?        00:00:00 sleep 10000s

注意: 以此类作业虽然被送往后台,但其依然与终端相关;此时,如果终端进程终止,则与终端相关的进程也会终止,位于后台的进程,也会终止 。如果希望把送往后台的作业剥离与终端的关系,可使用命令: nohop COMMAND & , 则立即转入与终端无关的模式

[root@localhost proc]# ping 172.18.250.219
 PING 172.18.250.219 (172.18.250.219) 56(84) bytes of data.
 64 bytes from 172.18.250.219: icmp_seq=1 ttl=64 time=0.750 ms
 64 bytes from 172.18.250.219: icmp_seq=2 ttl=64 time=0.345 ms
 64 bytes from 172.18.250.219: icmp_seq=3 ttl=64 time=0.304 ms
 64 bytes from 172.18.250.219: icmp_seq=4 ttl=64 time=0.354 ms
 64 bytes from 172.18.250.219: icmp_seq=5 ttl=64 time=0.527 ms
 64 bytes from 172.18.250.219: icmp_seq=6 ttl=64 time=0.335 ms
 64 bytes from 172.18.250.219: icmp_seq=7 ttl=64 time=14.7 ms
 64 bytes from 172.18.250.219: icmp_seq=8 ttl=64 time=3.56 ms
 64 bytes from 172.18.250.219: icmp_seq=9 ttl=64 time=0.322 ms
 64 bytes from 172.18.250.219: icmp_seq=10 ttl=64 time=0.225 ms
 64 bytes from 172.18.250.219: icmp_seq=11 ttl=64 time=0.367 ms
 64 bytes from 172.18.250.219: icmp_seq=12 ttl=64 time=0.239 ms
 64 bytes from 172.18.250.219: icmp_seq=13 ttl=64 time=0.283 ms
 64 bytes from 172.18.250.219: icmp_seq=14 ttl=64 time=0.373 ms
 64 bytes from 172.18.250.219: icmp_seq=15 ttl=64 time=0.337 ms
 ^Z
 [1]+  Stopped                 ping 172.18.250.219                     //ctrl +z  暂停命令
[root@localhost proc]# bg                                            //转入后台运行
[1]+ ping 172.18.250.219 &   
 [root@localhost proc]# 64 bytes from 172.18.250.219: icmp_seq=16 ttl=64 time=1.38 ms
 64 bytes from 172.18.250.219: icmp_seq=17 ttl=64 time=0.305 ms
 64 bytes from 172.18.250.219: icmp_seq=18 ttl=64 time=0.350 ms
 64 bytes from 172.18.250.219: icmp_seq=19 ttl=64 time=0.333 ms

[root@localhost website]# ps axu|tail –2

root       7086  0.0  0.0 107948   352 ?        S    16:03   0:00 sleep 60
 root       7087  0.0  0.1 128436  1264 pts/1    S+   16:03   0:00 ping 172.18.250.219                                                            //+表示在终端上运行
root       7088  0.0  0.1 155324  1872 pts/2    R+   16:03   0:00 ps axu

[root@localhost website]# ps axu|tail –2


root       7021  0.0  0.0      0     0 ?        S    15:58   0:00 [kworker/0:1]
 root       7086  0.0  0.0 107948   352 ?        S    16:03   0:00 sleep 60                                                                
 root       7087  0.0  0.1 128436  1264 pts/1    S    16:03   0:00 ping 172.18.250.219
 root       7089  0.0  0.1 155324  1872 pts/2    R+   16:03   0:00 ps axu

[root@localhost website]# ps axu|tail –2                                   //终端断开之后,相关进程也会终止


root       7097  0.0  0.0 107948   348 ?        S    16:04   0:00 sleep 60
 root       7099  0.0  0.1 155324  1876 pts/2    R+   16:05   0:00 ps axu
 [root@localhost website]# ps axu|grep ping
 root       2349  0.0  0.1 617976  1420 ?        Sl   10:39   0:01 /usr/libexec/gsd-housekeeping                                      
 root       7109  0.0  0.0 112708   972 pts/2    S+   16:05   0:00 grep --color=auto ping

如何查看当前系统的所有作业

jobs 命令

  • 格式 : jobs
  • 功能 : 查看当前系统的作业。

可实现作业控制的常用命令

  • # fg :把作业从后门周往前台来。
  • # bg : 后台停止的作业继续运行。
  • # kill  :终止作业进程。百分号%在这里不能省略,如果省略就变成进程号了。
[root@localhost ~]# 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=22.8 ms
 64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=24.8 ms
 64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=23.8 ms
 ^Z
 [1]+  Stopped                 ping 172.18.0.1
 [root@localhost ~]# jobs
 [1]+  Stopped                 ping 172.18.0.1
 [root@localhost ~]# vim /etc/passwd

[2]+  Stopped                 vim /etc/passwd
 [root@localhost ~]# jobs
 [1]-  Stopped                 ping 172.18.0.1
 [2]+  Stopped                 vim /etc/passwd
 [root@localhost ~]# fg
 vim /etc/passwd

[2]+  Stopped                 vim /etc/passwd
 [root@localhost ~]# fg 1
 ping 172.18.0.1
 64 bytes from 172.18.0.1: icmp_seq=4 ttl=64 time=2.26 ms
 64 bytes from 172.18.0.1: icmp_seq=5 ttl=64 time=0.568 ms
 64 bytes from 172.18.0.1: icmp_seq=6 ttl=64 time=0.400 ms
 64 bytes from 172.18.0.1: icmp_seq=7 ttl=64 time=0.536 ms
 ^Z
 [1]+  Stopped                 ping 172.18.0.1
 [root@localhost ~]# jobs
 [1]+  Stopped                 ping 172.18.0.1
 [2]-  Stopped                 vim /etc/passwd

nice命令

  • 功能 : 以指定的 nice 值启动并运行命令。
  • 格式 : nice [OPTION] [COMMAND[ARG] ... ]
  • 选项:

    -n NICE : 指定 nice 值。

    注意 :仅管理员可调低 nice 值。

renice 命令
  • 对运行中的进程调整 nice 值。
  • 格式: renice [-n] NICE PID ...
[root@localhost ~]# nice -n -5 vim &
 [1] 8764
 [root@localhost ~]# ps -l
 F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
 4 S     0   8348   8344  0  80   0 - 29153 do_wai pts/1    00:00:00 bash
 4 T     0   8764   8348  0  75  -5 - 37279 do_sig pts/1    00:00:00 vim
 0 R     0   8765   8348  0  80   0 - 38300 -      pts/1    00:00:00 ps

[1]+  Stopped                 nice -n -5 vim
 [root@localhost ~]# renice -n 0 8764
 8764 (process ID) old priority -5, new priority 0
 [root@localhost ~]# ps -l
 F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
 4 S     0   8348   8344  0  80   0 - 29153 do_wai pts/1    00:00:00 bash
 4 T     0   8764   8348  0  80   0 - 37279 do_sig pts/1    00:00:00 vim
 0 R     0   8775   8348  0  80   0 - 38300 -      pts/1    00:00:00 ps