大家都知道在Windows下怎么使用任务管理器来管理进程,那么在Linux下呢?
今天我们一起认识一下如何在Linux系统中使用任务管理器管理进程,保证我们的Linux服务器运行的很流畅。

查看和控制进程

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

一、查看进程

了解系统中进程的状态是对进程进行管理的前提,使用不同的命令工具可以从不同的角度查看进程状态,常用查看进程的命令有:

(1)PS命令——查看静态的进程统计信息

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

常用的参数有:

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

注意,有一部分的选项不带“-”选项的,如果不小心加上可能会出现错误,详细使用情况可以参考man手册!

[root@localhost ~]# ps aux
//以简单列表的形式显示出进程信息
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.1  0.3 128092  6708 ?        Ss   17:56   0:01 /usr/lib/sys
root          2  0.0  0.0      0     0 ?        S    17:56   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    17:56   0:00 [ksoftirqd/0
root          6  0.0  0.0      0     0 ?        S    17:56   0:00 [kworker/u25
root          7  0.0  0.0      0     0 ?        S    17:56   0:00 [migration/0
root          8  0.0  0.0      0     0 ?        S    17:56   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        R    17:56   0:00 [rcu_sched]
                                                    ……………………            //省略部分内容

上述输出信息中,第一行为列表标题,其中各字段的含义描述如图:
Linux系统管理任务进程详解_第1张图片

[root@localhost ~]# ps -elf
//以长格式显示系统中的进程信息,并且包含更丰富的内容
//(包括对应进程的父进程的PID号)
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 - 32023 ep_pol 17:56 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root          2      0  0  80   0 -     0 kthrea 17:56 ?        00:00:00 [kthreadd]
1 S root          3      2  0  80   0 -     0 smpboo 17:56 ?        00:00:00 [ksoftirqd/0]
                                                                    …………                    //省略部分内容
[root@localhost ~]# ps
   PID TTY          TIME CMD
  2954 pts/0    00:00:00 bash
  3298 pts/0    00:00:00 ps
//只显示当前用户会话中打开的进程
[root@localhost ~]# ps aux | grep bash
//由于系统中运行的进程数量较多,需要查询某一个进程的信息时
//可以结合管道操作和grep命令进行过滤
root        696  0.0  0.0 115248   936 ?        S    17:56   0:00 /bin/bash /usr/sbin/ksmtuned
root       2666  0.0  0.1 116572  3392 tty2     Ss+  17:57   0:00 -bash
root       2954  0.0  0.1 116432  3164 pts/0    Ss   17:58   0:00 -bash
root       3309  0.0  0.0 112664   972 pts/0    R+   18:26   0:00 grep --color=auto bash

(2)top命令——显示进程动态信息

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

[root@localhost ~]# top

Linux系统管理任务进程详解_第2张图片

相关信息的含义:
Linux系统管理任务进程详解_第3张图片

在top命令的全屏操作界面中,可以

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

若通过top排名工具发现某个进程CPU占用了非常高,需要终止该进程的阳性,可以在top操作界面中按“k”键会出现“PID to signal/kill [default pid = 3513] ”的提示信息, 根据提示输入指定进程的PID好并按Enter键,出现“Send pid 3513 signal [15/sigterm] ”的二次确认信息,然后按Enter键确认即可终止对应的进程。

(3)pgrep命令——查询进程信息

当使用ps命令查询某个进程的PID信息是,往往需要结合grep命令对输出信息进行过滤,但这样使用非常不方便,而pgrep命令正是查询特定进程信息的专用工具。使用pgrep命令可以根据进程的名称,运行进程的用户、进程所在的终端等多种属性查询特定进程的PID号。

通过pgrep命令,可以只指定进程的一部分名称进行查询,结合“-l”选项可以同时输出对应的进程名(否则只输出PID好,不便于理解)。

[root@localhost ~]# pgrep -l "log"
//查询进程名中包含“log”的进程及其PID号
399 xfs-log/dm-0
592 xfs-log/sda1
642 abrt-watch-log
658 abrt-watch-log
661 systemd-logind
987 rsyslogd
2649 login

还可以结合“-U”选项查询特定用户的进程、“-t”选项查询在特定终端运行的进程。比如:

[root@localhost ~]# pgrep -l -U root -t tty2
//查询用户root在tty2终端上运行的进程及PID号
2666 bash

(4)pstree命令——查看进程树

pstree命令可以输出Linux操作系统中各进程的树形结构,以更加直观地判断各进程之间的相互关系(父子进程)。

pstree命令默认情况只显示各进程的名称,可以结合以下选项:

  • -p:可以列出对应的PID号;
  • -u:可以列出对应的用户名;
  • -a:可以列出完整的命令信息。
[root@localhost ~]# pstree -aup
//查看当前系统的进程树,包括各进程对应的PID号、用户名、完整命令等信息。
//输出结果可以看出,systemd进程确实实际Linux操作系统中所有进程的“始祖”。
systemd,1 --system --deserialize 26
  ├─ModemManager,678
  │   ├─{ModemManager},718
  │   └─{ModemManager},721
  ├─NetworkManager,746 --no-daemon
  │   ├─{NetworkManager},758
  │   └─{NetworkManager},761
                                                    …………                                //省略部分内容
[root@localhost ~]# pstree -ap xiaoli
bash,43888
  └─vim,44047 123.txt
//查看只属于用户xiaoli的进程树结构

二、控制进程

(1)启动进程

在Linux操作系统中,可以由用户手工启动或者按预定计划调度启动新的进程。

1)手工启动进程

由用户手工输入命令或者可执行程序的路径,可以至少启动一个进程。根据该进程是否需要占用当前的命令终端,手工启动又可以分为前台启动和后台启动。

进程子啊前台运行(如执行“ls -l”命令)是,用户必须等到该进程执行结束并退出以后才能继续输入其他命令,大多数命令操作在前台执行运行。进程在后台运行时,用户可以据需在当前终端中输入其他命令,而无须等待该进程结束,适用于运行耗时较长的操作。

启动后台进程需要使用“&”操作符,将“&”操作符放在要执行命令的最后面,进程启动后直接放入后台运行,而不占用前台的命令操作界面,方便用户进行其他操作。

[root@localhost ~]# cp /dev/cdrom /a &
//复制系统光盘(内容较多,耗时较长,建议放到后台运行)
1] 44271
//输出信息中华包括后台任务序号、PID号    

2)调度启动进程

在服务器维护工作中,经常需要执行一些比较费时而且较占用资源的任务(如数据备份)这些任务更适合在相对空闲的时候(如夜间)进行。这是就需要用户实现进行调度安排,指定任务运行的时间,当系统达到设定时间时会自动启动并完成指定的任务。调度启动的计划任务进程均在后台运行,不会占用用户的命令终端。

进度的调度启动可以通过at、crontab命令进行设置,其中at命令用于设置一次性计划任务;crontab命令用于设置周期性运行。关于at命令、crontab命令可以参考博文:Linux系统计划任务管理详解

(2)改变进程的运行方式

1)挂起当前的进程

当Linux操作系统中的命令正在前台执行时(尚未结束),按ctrl+z组合键可以将当前进程挂起(调入后台并停止执行),这种操作需要暂停当前进程并进行其他操作时特别有用。比如:

 [root@localhost ~]# cp /dev/cdrom mycd.iso
^Z
[1]+  已停止               cp -i /dev/cdrom mycd.iso

2)查看后台的进程

需要查看当前终端中在后台运行的进程任务是,可以使用“jobs”命令,结合“-l”选型可以同时显示该进程对应的PID号。在jobs命令的树池结果中,每一行记录对应一个后台进程的状态信息,行首的数字表示该进程在后台的任务编号。若当前终端没有后台进程,将不会显示人任何信息。比如:

[root@localhost ~]# jobs -l
[1]+ 44487 停止                  cp -i /dev/cdrom mycd.iso

3)将后台的进程恢复运行

使用“bg”命令,可以将后台中暂停执行(如按ctrl+z组合键挂起)的任务恢复运行,继续在后台执行操作,而使用“fg”命令可以将后台任务重新恢复到前台运行。

除非后台中的任务只有一个,否则bg和fg命令都需要指定后台进程的任务编号作为参数。

[root@localhost ~]# fg 1
cp -i /dev/cdrom mycd.iso
//在前台占用终端
[root@localhost ~]# jobs -l
[1]+ 44601 停止                  cp -i /dev/cdrom mycd.iso
[root@localhost ~]# bg 1
//放入后台运行
[1]+ cp -i /dev/cdrom mycd.iso &
[root@localhost ~]# jobs -l
[1]+ 44601 运行中               cp -i /dev/cdrom mycd.iso &

(3)终止进程执行

当用户在前台执行某个进程时,可以按ctrl+c组合键强制进行中断。中断前台进程的运行后,系统将返回命令行提示符等待用户输入新的命令。(如果ctrl+c组合键无法终止程序时,可以使用专用的进程终止工具kill、killall和pkill)。

1)使用kill命令终止进程

通过kill命令终止进程时,需要使用进程的PID号作为参数。无特定选项时,kill命令将给该进程发送终止信号并正常退出运行。比如:

[root@localhost ~]# pgrep -l "sshd"
//查询目标进程的PID号
1263 sshd
44415 sshd
[root@localhost ~]# kill 1263
[root@localhost ~]# kill 44415
//终止指定PID的进程
[root@localhost ~]# pgrep -l "sshd"
//确认进程已终止

对于无法正常终止的系统进程,在必要时可以结合“-9”选项强制终止(强制终止可能会导致数据丢失等情况,一般情况不建议使用),比如:

[root@localhost ~]# vim 123.txt                                        //打开vim程序并挂起作为测试

[1]+  已停止               vim 123.txt
[root@localhost ~]# jobs -l                                              //查询目标进程的PID号
[1]+ 45874 停止                  vim 123.txt
[root@localhost ~]# kill 45874                                         //尝试正常结束进程
[root@localhost ~]# jobs -l                                              //但发现vim进程并未退出
[1]+ 45874 停止                  vim 123.txt
[root@localhost ~]# kill -9 45874                                   //强制终止目标进程
[root@localhost ~]# jobs -l                                            //测试效果(进程已死)
[1]+ 45874 已杀死               vim 123.txt

2)使用killall命令终止进程

使用killall命令可以通过进程名称来终止进程,当需要结束系统中多个相同名称的进程时,使用killall命令将更加方便、效率更高,killall命令同样也有“-9”选项。

[root@localhost ~]# vim 123                                             //挂起第一个vim测试进程

[1]+  已停止               vim 123
[root@localhost ~]# vim 1234                                           //挂起第二个vim测试进程

[2]+  已停止               vim 1234
[root@localhost ~]# jobs -l                                               //确认带终止的进程信息
[1]- 45922 停止                  vim 123
[2]+ 45923 停止                  vim 1234
[root@localhost ~]# killall -9 vim                                     //通过进程名终止多个进程
[1]-  已杀死               vim 123
[2]+  已杀死               vim 1234
[root@localhost ~]# jobs -l                                               //确认效果

3)使用pkill命令终止进程

使用pkill命令可以根据进程的名称,运行该进程的用户、进程所在的终端等多种属性终止特定的进程,大部分选项与pgrep命令基本类似,如“-U”(指定用户)、“-t”(指定终端)等选项。使用起来非常方便。比如:

[root@localhost ~]# pgrep -l -U "xiaoli"                               //确认目标进程相关信息
43888 bash
[root@localhost ~]# pkill -9 -U "xiaoli"                                //强行终止用户xiaoli的进程
[root@localhost ~]# pgrep -l -U "xiaoli"                              //确认目标进程已被终止

———————— 本文至此结束,感谢阅读 ————————