现代的操作系统都支持多任务, 这意味着操作系统需要在多个程序之间不停快速切换以造成多个程序在同时执行的假象. Linux内核也是如此, 它通过"进程"实现不同程序间的调度, "进程"就是Linux 组织安排正在等待使用 CPU的各种程序的方式.
这一章将介绍以下命令:
ps– Report a snapshot of current processes
top – Display tasks
jobs – List active jobs
bg – Place a job in the background
fg – Place a job in the foreground
kill – Send a signal to a process
killall – Kill processes by name
shutdown – Shutdown or reboot the system
ps命令源自print snapshot的首字母, 意为打印快照, 不过此处快照指的是进程快照而非屏幕:
如果需要获得更多信息, ps提供了两个常用的参数供我们选择: x 和 aux
请注意, 此处的x与aux并非独立的参数名字, 所以不需要在参数名前添加"-"符号.
不难发现, ps命令所打印的表格中有一行表头用于说明列的含义, 具体如下表:
标题 | 含义 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
USER | 用户 ID. 进程的所有者。 | ||||||||||||||||
%CPU | 以百分比表示的 CPU 使用率 | ||||||||||||||||
%MEM | 以百分比表示的内存使用率 | ||||||||||||||||
VSZ | 虚拟内存大小 | ||||||||||||||||
RSS | 进程占用的物理内存的大小,以千字节为单位。 | ||||||||||||||||
START | 进程启动的时间。若它的值超过24小时,则用天表示 | ||||||||||||||||
STAT | state的缩写, 描述了进程当前的状态, 详情见表:
|
如果我们在只知道ps命令的前提下希望实时获得目前进程的执行情况就需要不断地使用ps命令获取进程快照, 但top命令则解决了这个问题.
top作用与ps类似, 但top命令会持续的刷新最新的进程快照, 默认每3秒刷新一次.
上图中我们执行了top命令, 但它除了输出进程信息外还输出了一段其他内容, 该内容其实是Linux系统的相关信息, 具体见下表:
行号 | 字段 | 意义 |
---|---|---|
1 | top | 程序名。 |
15:07:35 | 当前时间。 | |
up 14 min | 这是正常运行时间。它是计算机从上次启动到现在所运行的时间。 在这个例子里,系统已经运行了14分钟。 | |
0 users | 有0个用户登录系统。 | |
load average: 0.52, 0.58, 0.59 |
加载平均值是指,等待运行的进程数目,也就是说,处于可以运行状态并共享 CPU 的进程个数。这里展示了三个数值,每个数值对应不同的时间段。第一个是最后60秒的平均值, 下一个是前5分钟的平均值,最后一个是前15分钟的平均值。若平均值低于1.0,则指示计算机工作不忙碌。 | |
2 | Tasks: | 总结了进程数目和这些进程的各种状态。 |
3 | Cpu(s): | 这一行描述了 CPU 正在进行的活动的特性。 |
0.0%us | 0.0% 的 CPU 被用于用户进程。这意味着进程在内核之外。 | |
3.2%sy | 3.2%的 CPU 时间被用于系统(内核)进程。 | |
0.0%ni | 0.0%的 CPU 时间被用于"nice"(低优先级)进程。 | |
96.8%id | 98.3%的 CPU 时间是空闲的。 | |
0.0%wa | 0.0%的 CPU 时间来等待 I/O。 | |
4 | Mem: | 展示物理内存的使用情况。 |
5 | Swap: | 展示交换分区(虚拟内存)的使用情况。 |
当我们在终端窗口运行了一个程序后(如top), 我们需要知道如何控制它;
当我们在执行程序的终端窗口中按下ctrl+c后, 将会向当前运行中的程序发送请求终止信号, 符合规范的程序当收到该信号后将会执行信息保存\内存释放\子进程终止等操作, 最终退出.
在章节开始时, 我们提到Linux是多任务系统, 但当我们执行top命令时, 终端就被top命令占用了, 我们无法同时进行其他操作(当然你可以再开一个终端, 往往我们希望一些耗时工作在默默执行的同时我们仍能够控制操作系统, 因此引申出了"后台进程"的概念.
想要将一个进程放到后台执行, 只需要在命令末尾添加"&"符号
如此, 在top执行的同时, 该终端仍可以进行其他操作; 并且, 运行后台任务时, 终端会返回一些信息以帮助我们控制我们运行的任务;
"[1] 92"意味着我们运行的进程任务号(job)为1, PID为92.
PID可以说是进程的身份证号, 几乎所有多任务操作系统中都会有该概念. 而job则可以配合Linux中的jobs命令使用
当我们运行jobs命令时, 终端中会显示当前所有正在后台执行的进程, 而第一列中的编号正是我们使用"&"将其放到后台执行时的job编号.
当一个进程处于后台时, 我们无法对其进行操作, 因此Linux提供了一个将后台进程返回前台的指令fg.
我们可以使用如下指令使一个后台进程返回前台:
fg %job
其中, job是目标进程的任务号(job), 如上例中的top则为1; 符号"%"不可省略, 它代表了我们所输入的是进程的job.
有时候我们想暂停手头上的事情优先处理另一件事, ctrl+z就可以使我们轻松地完成这样的需求.
当我们对一个前台程序按下ctrl+z时, 该程序会进入后台并被挂起(不占用CPU时间), 直到我们使用fg或bg将其恢复.
如果一个进程已经在运行, 我们就无法通过"&"使其在后台工作, 因此Linux提供了bg命令.
再比如我们使用ctrl+z挂起了一个进程后, 我们可能希望他在后台继续执行它的任务(UI绘制, 数据计算, IO操作等), 那么我们可以使用bg命令令其在后台占用CPU时间以继续工作.
bg命令与fg命令的作用截然相反, 但它们的使用方法非常相似:
bg %job
kill 命令被用来给程序发送信号。它最常见的语法形式看起来像这样:
kill [-signal] PID...
如果在命令行中没有指定信号,那么默认情况下,发送 TERM(Terminate,终止)信号。kill 命令被经常用来发送以下命令:
编号 | 名字 | 含义 |
---|---|---|
1 | HUP | 挂起(Hangup)。这是美好往昔的残留部分,那时候终端机通过电话线和调制解调器连接到 远端的计算机。这个信号被用来告诉程序,控制的终端机已经“挂断”。 通过关闭一个终端会话,可以展示这个信号的作用。在当前终端运行的前台程序将会收到这个信号并终止。
许多守护进程也使用这个信号,来重新初始化。这意味着,当一个守护进程收到这个信号后, 这个进程会重新启动,并且重新读取它的配置文件。Apache 网络服务器守护进程就是一个例子。 |
2 | INT | 中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。 |
9 | KILL | 杀死。这个信号很特别。尽管程序可能会选择不同的方式来处理发送给它的 信号,其中也包含忽略信号,但是 KILL 信号从不被发送到目标程序。而是内核立即终止 这个进程。当一个进程以这种方式终止的时候,它没有机会去做些“清理”工作,或者是保存工作。 因为这个原因,把 KILL 信号看作最后一招,当其它终止信号失败后,再使用它。 |
15 | TERM | 终止。这是 kill 命令发送的默认信号。如果程序仍然“活着”,可以接受信号,那么 这个它会终止。 |
18 | CONT | 继续。在一个停止信号后,这个信号会恢复进程的运行。 |
19 | STOP | 停止。这个信号导致进程停止运行,而不是终止。像 KILL 信号,它不被 发送到目标进程,因此它不能被忽略。 |
我们可以选择使用"-"符号+编号或信号名来指定kill命令所发送的信号.
如下, 我们对top进程发送了-1(-HUP)信号, 使其挂起了:
不仅如此, 我们也可以使用job来代替PID, 比如上图中我们就可以使用"%1"来替代"104";
进程和文件一样, 也拥有权限的区分, 只有所有者或root用户才能通过kill命令对进程发送信号.
除了上述我们通过kill命令常用的信号外, Linux中还有其他常用信号:
编号 | 名字 | 含义 |
---|---|---|
3 | QUIT | 退出 |
11 | SEGV | 段错误(Segmentation Violation)。如果一个程序非法使用内存,就会发送这个信号。也就是说, 程序试图写入内存,而这个内存空间是不允许此程序写入的。 |
20 | TSTP | 终端停止(Terminal Stop)。当按下 Ctrl-z 组合键后,终端发送这个信号。不像 STOP 信号, TSTP 信号由目标进程接收,且可能被忽略。 |
28 | WINCH | 改变窗口大小(Window Change)。当改变窗口大小时,系统会发送这个信号。 一些程序,像 top 和 less 程序会响应这个信号,按照新窗口的尺寸,刷新显示的内容。 |
有时我们需要同时向多个进程发送信号, 而kill则无法满足我们的需求.
这时, 我们就可以通过killall命令按 进程所有者 或 特定程序名 等条件筛选并同时发送信号.
killall [-u user] [-signal] name...
比如, 我们想同时终止所有进程名为top的进程
除了上文中介绍的常用进程相关指令外, 还有部分较常用的进程相关指令将在下表中列出, 此处不予展开:
命令名 | 命令描述 |
---|---|
pstree | 输出一个树型结构的进程列表(processtree),这个列表展示了进程间父/子关系。 |
vmstat | 输出一个系统资源使用快照,包括内存,交换分区和磁盘 I/O。 为了看到连续的显示结果,则在命令名后加上更新操作延时的时间(以秒为单位)。例如,“vmstat 5”。 ,按下 Ctrl-c 组合键, 终止输出。 |
xload | 一个图形界面程序,可以画出系统负载随时间变化的图形。 |
tload | terminal load与 xload 程序相似,但是在终端中画出图形。使用 Ctrl-c,来终止输出。 |