简介
程序是保存在外部存储介质(如硬盘)中的可执行机器代码和数据的静态集合,而进程是在 CPU 及内存中处于动态执行状态的计算机程序。在 Linux 操作系统中,每个程序启动后可以创建一个或多个进程。例如,提供 Web 服务的 httpd 程序,当有大量用户同时访问 Web页面时,httpd 程序可能会创建多个进程来提供服务。
查看进程
1.ps 命令——查看静态的进程统计信息
ps 命令是 Linux 操作系统中最为常用的进程查看工具,主要用于显示包含当前运行的各进程完整信息的静态快照。通过不同的命令选项,可以有选择性地查看进程信息。
a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将
显示系统中所有的进程信息。
u:使用以用户为主的格式输出进程信息。
x:显示当前用户在所有终端下的进程信息。
-e:显示系统内的所有进程信息。
-l:使用长(Long)格式显示进程信息。
-f:使用完整的(Full)格式显示进程信息。
习惯上将上述选项组合在一起使用,如执行“ps aux”或“ps -elf”命令。
(1)执行如下的“ps aux”命令后,将以简单列表的形式显示出进程信息:
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 193700 4052 ? Ss 18:54 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 18:54 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 18:54 0:03 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 18:54 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 18:54 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 18:54 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 18:54 0:01 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 18:54 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 18:54 0:00 [kdevtmpfs]
root 13 0.0 0.0 0 0 ? S< 18:54 0:00 [netns]
root 14 0.0 0.0 0 0 ? S 18:54 0:00 [khungtaskd]
root 15 0.0 0.0 0 0 ? S< 18:54 0:00 [writeback]
root 16 0.0 0.0 0 0 ? S< 18:54 0:00 [kintegrityd]
root 17 0.0 0.0 0 0 ? S< 18:54 0:00 [bioset]
root 18 0.0 0.0 0 0 ? S< 18:54 0:00 [kblockd]
root 19 0.0 0.0 0 0 ? S< 18:54 0:00 [md]
上述输出信息中,第一行为列表标题,其中各字段的含义描述如下。
USER:启动该进程的用户账号的名称。
PID:该进程在系统中的数字 ID 号,在当前系统中是唯一的。
%CPU:CPU 占用的百分比。
%MEM:内存占用的百分比。
VSZ:占用虚拟内存(swap 空间)的大小。
RSS:占用常驻内存(物理内存)的大小。
TTY:表明该进程在哪个终端上运行。“?”表示未知或不需要终端。
STAT:显示进程当前的状态,如 S(休眠)、R(运行)、Z(僵死)、<(高优先级)、
N(低优先级)、s(父进程)、+(前台进程)、l(多线性进程)、D(不可中断项目)。对处于僵死状态的进程应该予以手
动终止。
START:启动该进程的时间。
TIME:该进程占用的 CPU 时间。
COMMAND:启动该进程的命令的名称。
(2)执行如下的“ps -elf”命令,则将以长格式显示系统中的进程信息,并且包含更丰富的内容:
[root@localhost ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 48425 ep_pol 18:54 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root 2 0 0 80 0 - 0 kthrea 18:54 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 18:54 ? 00:00:03 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 18:54 ? 00:00:00 [kworker/0:0H]
1 S root 7 2 0 -40 - - 0 smpboo 18:54 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 18:54 ? 00:00:00 [rcu_bh]
1 R root 9 2 0 80 0 - 0 - 18:54 ? 00:00:01 [rcu_sched]
5 S root 10 2 0 -40 - - 0 smpboo 18:54 ? 00:00:00 [watchdog/0]
5 S root 12 2 0 80 0 - 0 devtmp 18:54 ? 00:00:00 [kdevtmpfs]
1 S root 13 2 0 60 -20 - 0 rescue 18:54 ? 00:00:00 [netns]
1 S root 14 2 0 80 0 - 0 watchd 18:54 ? 00:00:00 [khungtaskd]
1 S root 15 2 0 60 -20 - 0 rescue 18:54 ? 00:00:00 [writeback]
1 S root 16 2 0 60 -20 - 0 rescue 18:54 ? 00:00:00 [kintegrityd]
1 S root 17 2 0 60 -20 - 0 rescue 18:54 ? 00:00:00 [bioset]
1 S root 18 2 0 60 -20 - 0 rescue 18:54 ? 00:00:00 [kblockd]
1 S root 19 2 0 60 -20 - 0 rescue 18:54 ? 00:00:00 [md]
1 S root 25 2 0 80 0 - 0 kswapd 18:54 ? 00:00:02 [kswapd0]
1 S root 26 2 0 85 5 - 0 ksm_sc 18:54 ? 00:00:00 [ksmd]
1 S root 27 2 0 99 19 - 0 khugep 18:54 ? 00:00:00 [khugepaged]
由于系统中运行的进程数量较多,需要查询某一个进程的信息时可以结合管道操作和grep 命令进行过滤。
[root@localhost ~]# ps aux | grep bash
root 768 0.0 0.0 115256 696 ? S 18:54 0:00 /bin/bash /usr/sbin/ksmtuned
root 2047 0.0 0.0 51332 48 ? Ss 19:07 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root 2677 0.0 0.1 116296 1400 pts/0 Ss+ 19:07 0:00 bash
root 2748 0.0 0.2 116304 2584 pts/1 Ss 19:08 0:00 -bash
root 40724 0.0 0.0 112680 980 pts/1 R+ 22:23 0:00 grep --color=auto bash
(3)直接执行不带任何选项的 ps 命令时,将只显示当前用户会话中打开的进程
[root@localhost ~]# ps
PID TTY TIME CMD
2748 pts/1 00:00:00 bash
40733 pts/1 00:00:00 ps
2.top 命令——查看进程动态信息
使用 ps 命令查看到的是一个静态的进程信息,并不能连续地反馈出当前进程的运行状态。若希望以动态刷新的方式显示各进程的状态信息,可以使用 top 命令。top 命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪包括 CPU、内存等系统资源占用情况,默认情况下每三秒钟刷新一次,其作用基本类似于 Windows 操作系统中的任务管理器
直接执行top命令如下:
上述输出信息中,开头的部分显示了系统任务(Tasks)、CPU 占用、内存占用(Mem)、交换空间(Swap)等汇总信息,汇总信息下方依次显示当前进程的排名情况。相关信息的含义表述如下。
系统任务(Tasks)信息:total,总进程数;running,正在运行的进程数;sleeping,休眠的进程数;stopped,中止的进程数;zombie,僵死无响应的进程数。
CPU 占用信息:us,用户占用;sy,内核占用;ni,优先级调度占用;id,空闲 CPU;wa,I/O 等待占用;hi,硬件中断占用;si,软件中断占用;st,虚拟化占用。要了解空闲的 CPU 百分比,主要看%id 部分。
内存占用(Mem)信息:total,总内存空间;free,空闲内存;used,已用内存;buff/cache,物理内存和交换内存的缓冲区总和。
交换空间(Swap)占用:total,总交换空间;free,空闲交换空间;used,已用交换空间;avail Mem,可用物理空间。
在 top 命令的全屏操作界面中的一些快捷方式:
按 P 键:根据 CPU 占用情况对进程列表进行排序
按 M 键:根据内存占用情况进行排序
按 N 键:根据启动时间进行排序
按 h 键:可以获得 top程序的在线帮助信息
按 q 键:可以正常地退出 top 程序
按 k 键:终止进程的运行
若通过 top 排名工具发现某个进程 CPU 占用率非常高,需要终止该进程的运行
方法:可以在top 操作界面中按 k 键,然后在列表上方将会出现“PID to signal/kill [default pid =3180]:”的提示信息,根据提示输入指定进程的 PID 号并按 Enter 键,出现“Send pid 5597 signal [15/sigterm]”的二次确认的提示信息,然后按 Enter 键确认即可终止对应的进程。
3.pgrep 命令——查询进程信息(条件型查询)
当使用 ps 命令查询某个进程的 PID 信息时,往往需要结合 grep 命令对输出结果进行过滤,但这样使用非常不方便,而 pgrep 命令正是查询特定进程信息的专用工具。使用 pgrep命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性查询特定进程的PID号。
pgrep -l "关键字":查看包含关键字的进程及PID号
[root@localhost ~]# pgrep -l "log"
399 xfs-log/dm-0
563 xfs-log/sda1
628 xfs-log/dm-2
693 abrt-watch-log
694 abrt-watch-log
695 systemd-logind
712 rsyslogd
pgrep -u 用户名 -t 终端:查询某个用户在特定终端上运行的进程及PID号
[root@localhost ~]# pgrep -l -U root -t tty1
1207 X
4.pstree 命令——查看进程树
pstree 命令可以输出 Linux 操作系统中各进程的树形结构,以更加直观地判断各进程之间的相互关系(父进程、子进程)。pstree 命令默认情况下只显示各进程的名称,结合“-p”选项使用时可以同时列出对应的 PID 号,结合“-u”选项可以列出对应的用户名,结合“-a”选项可以列出完整的命令信息。
执行“pstree -aup”命令可以查看当前系统的进程树,包括各进程对应的 PID 号、用户名、完整命令等信息。
[root@localhost ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 21
├─ModemManager,713
│ ├─{ModemManager},732
│ └─{ModemManager},741
├─NetworkManager,780 --no-daemon
│ ├─dhclient,1681 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf...
│ ├─{NetworkManager},786
│ └─{NetworkManager},789
使用 pstree 命令时,也可以只查看属于指定用户的进程树结构,只要指定用户名作为参数即可
[root@localhost ~]# pstree -ap shan
at-spi-bus-laun,41452
├─dbus-daemon,41457 --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
│ └─{dbus-daemon},41458
├─{at-spi-bus-laun},41453
├─{at-spi-bus-laun},41454
├─{at-spi-bus-laun},41455
└─{at-spi-bus-laun},41456