38. 进程 - 运行时作业管理

开篇词

在 Linux 中,每个程序都会在内存中创建至少一个进程,每个进程都有其对应的进程编号(PID),我们可以通过运行中的进程的编号来对其进行相应的操作。
 

准备必要的 Shell 脚本

我们来创建一个拥有死循环代码的 Shell 脚本来做演示:

echo '#!/bin/bash' > endless_job.sh
echo 'while true; do continue; done' >> endless_job.sh
cat endless_job.sh

我们已经创建一个用以进行无限循环操作的 Shell 脚本
我们不对脚本的代码做过多的阐述。我们只要知道该脚本一旦执行后,不会自行退出。
 

让脚本在后台运行

我们在同一时间执行两个脚本并让其在后台中持续运行:

bash ./endless_job.sh &
bash ./endless_job.sh &

借助 bash 命令来执行两个脚本并让其在后台中继续运行
 

列出所有后台运行的程序

我们可以使用 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 管理员手册:既简单又深刻

发布了132 篇原创文章 · 获赞 6 · 访问量 7949

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104191559