大家有没有想过,如果我们的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