开篇词
在 Linux 中,每个程序都会在内存中创建至少一个进程,每个进程都有其对应的进程编号(PID),我们可以通过运行中的进程的编号来对其进行相应的操作。
准备必要的 Shell 脚本
我们来创建一个拥有死循环代码的 Shell 脚本来做演示:
echo '#!/bin/bash' > endless_job.sh
echo 'while true; do continue; done' >> endless_job.sh
cat endless_job.sh
我们不对脚本的代码做过多的阐述。我们只要知道该脚本一旦执行后,不会自行退出。
让脚本在后台运行
我们在同一时间执行两个脚本并让其在后台中持续运行:
bash ./endless_job.sh &
bash ./endless_job.sh &
列出所有后台运行的程序
我们可以使用 jobs
命令来查看后台中有哪些程序正在运行中:
一些常用的参数:
选项 | 用途 |
---|---|
-l | 除基本的信息外,还会列出每个进程的编号 |
-p | 只列出每个进程的编号 |
-r | 只列出每个运行中的进程 |
-s | 只列出每个终止运行的进程 |
我们来看一下不跟参数的运行结果:
jobs
列出它们及其对应 PID
借助 -l
选项来列出作业及其进程编号:
jobs -l
只列出其对应的 PID
借助 -p
选项来列出作业的进程编号:
jobs -p
查看程序是如何在后台中运行的
我们来通过 top
看一下两个脚本的运行情况:
top
透过捷途,我们直到现在有三个程序正在运行中,有两个是我们刚刚运行的脚本,另一个则是 top 命令自身。
同时,我们还发现两个脚本共有一个问题,那就是它们在运行时消费了过多的 CPU 资源。
终止运行中的进程
我们可以使用 kill
命令结合一些相关的信号值来结束一个运行时进程的生命周期:
默认情况下,kill
命令发送 TERM(15) 信号至一个进程:
kill process_id [更多 ID] # 等价于 kill -TERM 以及 kill -15
一些常用的信号选项为:
信号 | 用途 |
---|---|
-TERM 或 -15 | 终止一或多个进程 |
-KILL 或 -9 | 终止一或多个进程并返回无法捕获或忽略的结果 |
-HUP 或 -1 | 挂断一或多个进程 |
-INT 或 -2 | 终端中断一或多个进程 |
-QUIT 或 -3 | 终端退出一或多个进程 |
kill
命令有三个执行结果,成功、失败以及部分成功:
返回码 | 用途 |
---|---|
0 | 终止成功 |
1 | 终止失败 |
64 | 部分终止成功(当指定了多个进程编号时) |
强制终止运行中的进程
不过,有时会发生特殊情况,默认信号无法终止一些进程。
此时我们就需要使用 KILL(9) 信号来对进程进行终止操作:
kill -KILL process_id [更多 ID] # 等价于 kill -9
正常终止运行中的进程
通常来说,我们使用默认的 TERM(15) 信号就足以终止一个运行时进程:
kill process_id [更多 ID]
由于该脚本的代码相对比较简单,所以基于这个脚本所运行的两个脚本可以使用 kill 命令的默认信号来将其终止:
kill 9476 9475
jobs
从截图中,我们可以看到两个进程都已被终止。
我所撰写的英文版本
38. Processes - Running Jobs Management
引用
参见
想看手册的其他内容?请访问该手册的所属专栏:《Linux 管理员手册:既简单又深刻》