linux中进程管理(ps、top、pstree、pgrep、jobs、&、kill、fg)

一、查看控制进程

程序是保存在外部存储介质(如硬盘)中的可执行机器代码和数据的静态集合,而进程 是在 CPU 及内存中处于动态执行状态的计算机程序。在 Linux 操作系统中,每个程序启动后可以创建一个或多个进程。

1、ps查看静态进程统计信息(Processes Statistic)

ps 命令是 Linux 操作系统中最为常用的进程查看工具,主要用于显示包含当前运行的各进程完整信息的静态快照。
ps 命令常用选项

选项 注释
a 显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将显 示系统中所有的进程信息。
u 使用以用户为主的格式输出进程信息。
x 显示当前用户在所有终端下的进程信息。
-e 显示系统内的所有进程信息。
-l 使用长(Long)格式显示进程信息。
-f 使用完整的(Full)格式显示进程信息。

**注:**ps 命令中常用的几个选项,有一部分选项是不带“-”前缀的(添加“-”前缀后含义可能会有出入)。习惯上将上述选项组合在一起使用,执行“ps aux”或“ps -elf”命令。

[root@localhost ~]# ps
   PID TTY          TIME CMD
 18695 pts/0    00:00:00 bash
 18804 pts/0    00:00:00 ps
//直接执行不带任何选项的 ps 命令时,将只显示当前用户会话中打开的进程
[root@localhost ~]# ps aux    //以简单列表的形式显示出系统进程信息
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 191044  4128 ?        Ss   02:46   0:02 /usr/lib/systemd/systemd --
root          2  0.0  0.0      0     0 ?        S    02:46   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    02:46   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   02:46   0:00 [kworker/0:0H]
root          6  0.0  0.0      0     0 ?        S    02:46   0:01 [kworker/u256:0]
root          7  0.0  0.0      0     0 ?        S    02:46   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    02:46   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        S    02:46   0:02 [rcu_sched]
··········
  • USER:启动该进程的用户账号的名称。
  • PID:该进程在系统中的数字 ID 号,在当前系统中是唯一的。
  • %CPU:CPU 占用的百分比。
  • %MEM:内存占用的百分比。
  • VSZ:占用虚拟内存(swap 空间)的大小。
  • RSS:占用常驻内存(物理内存)的大小。
  • TTY:表明该进程在哪个终端上运行。“?”表示未知或不需要终端。
  • STAT:显示进程当前的状态,如 S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程)。对处于僵死状态的进程应该予以手动终止。
  • START:启动该进程的时间。
  • TIME:该进程占用的 CPU 时间。
  • COMMAND:启动该进程的命令的名称。
[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 - 47761 ep_pol 02:46 ?        00:00:02 /usr/lib/systemd
1 S root          2      0  0  80   0 -     0 kthrea 02:46 ?        00:00:00 [kthreadd]
1 S root          3      2  0  80   0 -     0 smpboo 02:46 ?        00:00:00 [ksoftirqd/0]
1 S root          5      2  0  60 -20 -     0 worker 02:46 ?        00:00:00 [kworker/0:0H]
1 S root          6      2  0  80   0 -     0 worker 02:46 ?        00:00:01 [kworker/u256:0]
1 S root          7      2  0 -40   - -     0 smpboo 02:46 ?        00:00:00 [migration/0]
1 S root          8      2  0  80   0 -     0 rcu_gp 02:46 ?        00:00:00 [rcu_bh]
1 S root          9      2  0  80   0 -     0 rcu_gp 02:46 ?        00:00:02 [rcu_sched]
5 S root         10      2  0 -40   - -     0 smpboo 02:46 ?        00:00:00 [watchdog/0]
// PPID 列(表示对应进程的父进程的 PID 号)

2、top查看进程动态信息

使用 ps 命令查看到的是一个静态的进程信息,并不能连续地反馈出当前进程的运行状态。若希望以动态刷新的方式显示各进程的状态信息,可以使用 top 命令。top 命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪包括 CPU、内存等系统资源占用情况,默认情况下每三秒钟刷新一次,其作用基本类似于Windows 操作系统中的任务管理器。

[root@localhost ~]# top
top - 23:21:33 up 20:35,  2 users,  load average: 0.08, 0.03, 0.05
Tasks: 211 total,   1 running, 210 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3865308 total,  1219320 free,   862384 used,  1783604 buff/cache
KiB Swap:  4063228 total,  4063228 free,        0 used.  2687068 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                
     1 root      20   0  191044   4128   2516 S   0.0  0.1   0:02.51 systemd 
···················
系统任务(Tasks)信息 CPU 占用信息 内存占用(Mem)信息 交换空间(Swap)占用
total,总进程数 us,用户占用 total,总内存空间 buff/cache,物理内存和交换内存的缓冲区总和
running,正在运行的进程数 sy,内核占用 free,空闲内存 free,空闲交换空间
sleeping, 休眠的进程数 ni,优先级调度占用 used,已用内存 used,已用交换空间
stopped,中止的进程数 id,空闲CPU% buff/cache,物理内存和交换内存的缓冲区总和 avail Mem,可用物理空间
zombie,僵死无响应的进程数 wa,I/O 等待占用
hi,硬件中断占用
si,软件中断占用
st,虚拟化占用

top 命令的全屏操作界面

  • 按 P 键根据 CPU 占用情况对进程列表进行排序
  • 按 M 键根据内存占用情况进行排序
  • 按 N 键根据启动时间进行排序
  • 按 h 键可以获得 top 程序的在线帮助信息
  • 按q 键可以正常地退出 top 程序

按top 排名工具发现某个进程 CPU 占用率非常高,需要终止该进程的运行,可以在 top 操作界面中按 k 键,然后在列表上方将会出现“PID to signal/kill [default pid = 3180]:” 的提示信息,根据提示输入指定进程的 PID 号并按 Enter 键, 出现“Send pid 5597 signal [15/sigterm]”的二次确认的提示信息,然后按Enter 键确认即可终止对应的进程。

3、pgrep查询进程信息

[root@localhost ~]# pgrep -l ssh
1024 sshd
2853 ssh-agent
18693 sshd

[root@localhost ~]# pgrep -l -U root -t pts/0
18695 bash
  • “-l”选项可同时输出对应的进程名(否则只输出 PID 号,不便于理解)
  • “-U”选项查询特定用户的进程
  • “-t”选项查询在特定终端运行的进程

4、pstree查看进程树、

  • pstree 命令可以输出 Linux 操作系统中各进程的树形结构,以更加直观地判断各进程之间的相互关系(父进程、子进程)。
[root@localhost ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─2*[abrt-watch-log]
············
[root@localhost ~]# pstree -aup
systemd,1 --system --deserialize 13
  ├─ModemManager,752
  │   ├─{ModemManager},770
  │   └─{ModemManager},779
  ├─NetworkManager,6600 --no-daemon
··············
[root@localhost ~]# pstree -ap wu
bash,19406

“-p” 选项使用时可以同时列出对应的 PID 号
“-u”选项可以列出对应的用户名
“-a”选项可以列出完整的命令信息

二、进程控制

1、启动以及改变运行进程方式

1)手动启动进程方式

前台启动进程:用户手工输入命令或者可执行程序的路径,启动的进程
启动后台进程:需要使用“&”操作符,将“&”操作符放在要执行命令的最后面,进程启动后会直接放入后台运行,而不占用前台的命令操作界面,方便用户进行其他操作。

2)调度启动进程方式

进程的调度启动可以通过 at、crontab 命令进行设置,调度启动的计划任务进程均在后台运行,不会占用用户的命令终端。

3)改变进程的运行方式(Ctrl+Z)

挂起当前的进程

  • 当 Linux 操作系统中的命令正在前台执行时(运行尚未结束),按 Ctrl+Z 组合键可以将当前进程挂起(调入后台并停止执行),这种操作在需要暂停当前进程并进行其他操作时用。
4)查看后台的进程(jobs)
  • 需要查看当前终端中在后台运行的进程任务时,可以使用 jobs 命令,结合“-l”选项可以同时显示该进程对应的 PID 号。在 jobs 命令的输出结果中,每一行记录对应一个后台进程的状态信息,行首的数字表示该进程在后台的任务编号。若当前终端没有后台进程,将不会显示任何信息。
    [root@localhost ~]# jobs -l
5)将后台的进程恢复运行(fg)
  • 使用 bg(BackGround,后台)命令,可以将后台中暂停执行(如按 Ctrl+Z 组合键挂起)的任务恢复运行,继续在后台执行操作
  • 使用 fg 命令(ForeGround,前台),可以将后台任务重新恢复到前台运行
  • 除非后台中的任务只有一个,否则 bg 和 fg 命令都需要指定后台进程的任务编号作为参数。
    [root@localhost ~]# fg 1

2、终止执行进程(kill、killall 和 pkill)

1)使用 kill 命令终止进程

通过 kill 命令终止进程时,需要使用进程的 PID 号作为参数。无特定选项时,kill 命令将给该进程发送终止信号并正常退出运行,若该进程已经无法响应终止信号,则可以结合“-9” 选项强行终止进程。强制终止进程时可能会导致程序运行的部分数据丢失,因此不到不得已时不要轻易使用“-9”选项。

[root@localhost ~]# pgrep -l "sshd"	//查询目标进程的PID 号
5822 sshd
[root@localhost ~]# kill 5822	//终止指定PID 的进程
[root@localhost ~]# pgrep -l "sshd"	//确认进程已终止(查询时无结果)

[root@localhost ~]# vim file	//打开vim 程序并挂起作为测试
[1]+   Stopped	vim file
[root@localhost ~]# jobs -l	 //查询目标进程的PID 号
[1]+   7095 Stopped	vim file
[root@localhost ~]# kill 7095		//尝试正常结束进程
[root@localhost ~]# jobs -l			//但发现vim 进程并未退出
[1]+   7095 Stopped	vim file
[root@localhost ~]# kill -9 7095		//强制终止目标进程
[root@localhost ~]# jobs -l		//成功终止vim 进程
[1]+ 2993  已 杀死	vim file
2)使用 killall 命令终止进程
  • killall 命令可以通过进程名称来终止进程,当需要结束系统中多个相同名称的进程时,使用 killall 命令将更加方便,效率更高。
[root@localhost ~]# vim file1	//挂起第 1 个 vim 测试进程
[1]+   Stopped	vim file1
[root@localhost ~]# vim file2	//挂起第 2 个 vim 测试进程
[2]+   Stopped	vim file2
[root@localhost ~]# jobs -l		//确认待终止的进程信息
[1]-   7144 Stopped	vim file1
[2]+   7153 Stopped	vim file2
[root@localhost ~]# killall -9 vim	//通过进程名终止多个进程
[root@localhost ~]# jobs -l
[1]-   7144 Killed	vim file1
[2]+   7153 Killed	vim file2
3)使用 pkill 命令终止进程
  • 使用 pkill 命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特定的进程,“-U”(指定用户)、“-t”(指定终端)
[root@localhost ~]# pgrep –l -U "wlm"	  //确认目标进程相关信息
3773 bash
[root@localhost ~]# pkill -9 -U "wlm"	  //强行终止用户hackli 的进程
[root@localhost ~]# pgrep -l -U "wlm"	  //确认目标进程已被终止

猜你喜欢

转载自blog.csdn.net/wulimingde/article/details/109459508