使用进程管理工具,我们可以查询程序当前的运行状态,或终止一个进程; 任何进程都与文件关联;我们会用到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;
登录后可发表评论