Linux进程管理工具


使用进程管理工具,我们可以查询程序当前的运行状态,或终止一个进程; 任何进程都与文件关联;我们会用到lsof工具(list opened files),作用是列举系统中已经被打开的文件。在linux环境中,任何事物都是文件,设备是文件,目录是文件,甚至sockets也是文件。用好lsof命令,对日常的linux管理非常有帮助。

【查询进程】

    查询正在运行的进程信息

[root@wzxaini9 ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Apr08 ?        00:01:40 /usr/lib/systemd/systemd --system --deserialize 15
root         2     0  0 Apr08 ?        00:00:00 [kthreadd]
root         3     2  0 Apr08 ?        00:00:30 [ksoftirqd/0]
root         5     2  0 Apr08 ?        00:00:00 [kworker/0:0H]
root         7     2  0 Apr08 ?        00:00:00 [migration/0]
root         8     2  0 Apr08 ?        00:00:00 [rcu_bh]
root         9     2  0 Apr08 ?        00:01:05 [rcu_sched]
......

    例:查询归属于用户root的进程

[root@wzxaini9 ~]# ps -ef | grep root
root         1     0  0 Apr08 ?        00:01:40 /usr/lib/systemd/systemd --system --deserialize 15
root         2     0  0 Apr08 ?        00:00:00 [kthreadd]
root         3     2  0 Apr08 ?        00:00:30 [ksoftirqd/0]
root         5     2  0 Apr08 ?        00:00:00 [kworker/0:0H]
root         7     2  0 Apr08 ?        00:00:00 [migration/0]
root         8     2  0 Apr08 ?        00:00:00 [rcu_bh]
root         9     2  0 Apr08 ?        00:01:05 [rcu_sched]
......
[root@wzxaini9 ~]# ps -lu root
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0     1     0  0  80   0 - 10877 ep_pol ?        00:01:40 systemd
1 S     0     2     0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0     3     2  0  80   0 -     0 smpboo ?        00:00:30 ksoftirqd/0
1 S     0     5     2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:0H
1 S     0     7     2  0 -40   - -     0 smpboo ?        00:00:00 migration/0
1 S     0     8     2  0  80   0 -     0 rcu_gp ?        00:00:00 rcu_bh
1 R     0     9     2  0  80   0 -     0 -      ?        00:01:05 rcu_sched
......

    查询进程ID(适合只记得部分进程字段)

    例:查询进程名中含有re的进程

[root@wzxaini9 ~]# pgrep -l re
2 kthreadd

    以完整的格式显示所有的进程

[root@wzxaini9 ~]# ps -ajx
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     1     1     1 ?           -1 Ss       0   1:40 /usr/lib/systemd/systemd --system --deserialize 15
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     3     0     0 ?           -1 S        0   0:30 [ksoftirqd/0]
    2     5     0     0 ?           -1 S<       0   0:00 [kworker/0:0H]
    2     7     0     0 ?           -1 S        0   0:00 [migration/0]
    2     8     0     0 ?           -1 S        0   0:00 [rcu_bh]
    2     9     0     0 ?           -1 R        0   1:05 [rcu_sched]

    显示进程信息,并实时更新

[root@wzxaini9 ~]# top

    查看端口占用的进程状态:

[root@wzxaini9 ~]# lsof -i:80
COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
nginx     3256 root    7u  IPv4   24691      0t0  TCP *:http (LISTEN)
nginx     3257  www    7u  IPv4   24691      0t0  TCP *:http (LISTEN)
loglisten 3289 root    7u  IPv4 7907904      0t0  TCP wzxaini9:36230->169.254.0.71:http (ESTABLISHED)

    lsof -u 查看用户root的进程所打开的文件

[root@wzxaini9 ~]# lsof -u root
......

    查询nginx进程当前打开的文件

[root@wzxaini9 ~]# lsof -c nginx
COMMAND  PID USER   FD      TYPE             DEVICE  SIZE/OFF    NODE NAME
nginx   3256 root  cwd       DIR              253,1      4096       2 /
nginx   3256 root  rtd       DIR              253,1      4096       2 /
nginx   3256 root  DEL       REG                0,4             24689 /dev/zero
nginx   3256 root  DEL       REG                0,4             24688 /dev/zero

    查询指定的进程ID(1)打开的文件:

[root@wzxaini9 ~]# lsof -p 1
COMMAND PID USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd   1 root  cwd       DIR              253,1     4096          2 /
systemd   1 root  rtd       DIR              253,1     4096          2 /
systemd   1 root  txt       REG              253,1  1620416     102030 /usr/lib/systemd/systemd
systemd   1 root  mem       REG              253,1    20112      98953 /usr/lib64/libuuid.so.1.3.0

    查询指定目录下被进程开启的文件(使用+D 递归目录):

[root@wzxaini9 /]# lsof +d home/wwwlogs/
COMMAND  PID USER   FD   TYPE DEVICE  SIZE/OFF NODE NAME
nginx   3256 root    2w   REG   0,39   2899771  131 home/logs/error.log
......


【终止进程】

    杀死指定PID的进程 (PID为Process ID)

[root@wzxaini9 ~]# kill 10443

    杀死相关进程

[root@wzxaini9 ~]# kill -9 10443

    杀死job工作 (job为job number)

[root@wzxaini9 ~]# kill %job


【进程监控】

    查看系统中使用CPU、使用内存最多的进程;

[root@wzxaini9 ~]# top (p)

    输入top命令后,进入到交互界面;接着输入字符命令后显示相应的进程状态:

    对于进程,平时我们最常想知道的就是哪些进程占用CPU最多,占用内存最多。以下两个命令就可以满足要求:

        P:根据CPU使用百分比大小进行排序。

        M:根据驻留内存大小进行排序。

        i:使top不显示任何闲置或者僵死进程。

    这里介绍最常使用的几个选项


【分析线程栈】

    使用命令pmap,来输出进程内存的状况,可以用来分析线程堆栈;

[root@wzxaini9 /]# ps -ef | grep dbus
dbus      2477     1  0 Apr08 ?        00:02:03 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root     25265 22053  0 11:03 pts/0    00:00:00 grep --color=auto dbus
[root@wzxaini9 /]# pmap 2477
2477:   /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
00005611f7b03000    204K r-x-- dbus-daemon
00005611f7d35000      8K r---- dbus-daemon
00005611f7d37000      4K rw--- dbus-daemon
00005611f8eab000    380K rw---   [ anon ]


【综合运用】

    将用户root下的所有进程名以my_开头的进程终止:

[root@wzxaini9 ~]# ps -u root |  awk '/my_/ {print "kill -9 " $1}' | sh

    将用户root下所有进程名中包含HOST的进程终止:

[root@wzxaini9 ~]# ps -fe| grep root|grep HOST |awk '{print $2}' | xargs kill -9;


上一篇 下一篇

评论

登录后可发表评论