Linux job control

Linux 系统中有一个 job control 的概念,本文简单介绍什么是 job,以及常见的 job control 命令。本文中演示部分使用的环境为 ubuntu 18.04。

执行命令将创建一个或多个称为进程组(进程组)的进程。进程组包含一个或多个进程,每个进程属于一个进程组,也称为作业。

[En]

Executing a command creates one or more processes called a process group (process group). A process group contains one or more processes, each of which belongs to a process group, also known as job.

每个流程组都有一个主导流程(流程组长)。主导进程的ID是进程组的ID(进程组ID,PGID)。我们可以通过ps命令查看进程的PGID:

[En]

Each process group has a lead process (process group leader). The PID of the lead process is the ID (process group ID,PGID) of the process group. We can view the PGID of the process through the ps command:

红色框中的两个进程属于同一进程组(通过管道字符连接的进程属于同一进程组)。此进程组中的主导进程为16823,因此其ID成为该进程组的pgid。我们可以用下图来了解这些过程之间的关系:

[En]

The two processes in the red box belong to the same process group (processes connected by pipe characters belong to the same process group). The lead process in this process group is 16823, so its PID becomes the PGID of the process group. We can use the following figure to understand the relationship between these processes:

在进程组仍然存在且PGID不变的情况下,主导进程可以首先退出。进程组中的所有进程退出后,该进程组的认证期结束。

[En]

The lead process can exit first, while the process group still exists and the PGID does not change. After all processes in the process group exit, the certification period of the process group ends.

将流程划分为流程组的主要原因是可以对它们进行统一管理。说白了就是同时向集团内的所有流程发信号,这就是我们接下来要介绍的作业管理。

[En]

The main reason for dividing processes into process groups is that they can be managed uniformly. To put it bluntly, it is to signal all processes in the group at the same time, which is the job management that we will introduce next.

有了前面 job 的概念(进程组),接下来我们介绍如何管理 job。
jobs 命令
使用 vim 打开文件 test.txt,然后按下 ctrl + z,此时 vim 进入了后台:

输出中第一列方括号中的数字表示jobID,第二列停止表示作业的当前状态,第三列表示该作业执行的命令。

[En]

The number in the first column of square brackets in the output represents jobID, the second column Stopped represents the current status of job, and the third column represents the command executed by that job.

使用 jobs 命令可以查看当前会话中的的所有 jobs,此时执行 jobs 命令,输出的结果和上面一样:

& 符
在命令末尾添加符号(&S)以使作业在后台运行:

[En]

Add the & symbol to the end of the command to make job run in the background:

sleep 命令的 jobID 为 2,状态为 Running。

fg 命令
fg 命令是 foreground 的缩写。命令格式为 fg %n,它把当前或指定 ID 的 job 放到前台。下面我们操作一次 job 2:

此时 sleep 命令运行在前台,通过 ctrl + z 我们可以再次把它送回后台:

请注意此时 sleep 命令的状态已经变成了 Stopped。

ctrl + z
严格来说 ctrl + z 并不是一个 job 管理命令,它只是向当前进程发送一个 SIGSTOP 信号,该信号使进程进入暂停(stopped)状态,也就是挂起进程,此状态下,进程状态会被系统保存,此进程会被放置到作业队列中去,从而让出终端。使用 ctrl + z 我们可以暂停正在占用终端的进程而不结束它,然后我们可以使用终端命令来操作此进程。

bg 命令
bg 命令是 background 的缩写,命令格式为 bg %n,bg 命令和 ctrl + z 配合可以把前台命令切换到后台去执行。比如刚才我们通过 ctrl + z 把 sleep 命令切到了后台,但变成了 Stopped 状态,此时执行 bg %2 命令可以让 sleep 命令继续在后台执行:

kill 命令
kill 命令负责向进程发送信号,当然它也可以向 job 发送信号,在 jobID 前面添加 % 就可以了。比如 SIGCONT 是唤醒一个挂起的进程,所以我们也可以使用下面的命令把处于 Stooped 状态的 sleep 命令唤醒:

有时候使用 ctrl + c 无法杀死一个正在运行的前台进程,这是因为 ctrl + c 的本质是向进程发送 SIGINT 信号。SIGINT 是用来终止进程的,但是这是一个可以被忽略的信号,如果程序忽略了它,我们就无法通过 ctrl + c 来终止该进程。

此时,我们可以使用ctrl+z将进程切换到后台,然后使用kill%n(n是进程的作业ID)终止进程。默认情况下,KILL命令向进程发送SIGTERM信号,程序通常终止程序并在SIGTERM信号处理程序中执行资源清理。由于SIGTERM信号可以被程序处理,因此也可以忽略它,因此不可能以这种方式结束那些顽固的进程。

[En]

At this point, we can use ctrl + z to switch the process to the background, and then use kill% n (n is the jobID of the process) to terminate the process. The kill command sends a SIGTERM signal to the process by default, and the program normally terminates the program and performs resource cleaning in the SIGTERM signal handler. Since the SIGTERM signal can be processed by the program, it can also be ignored, so it is not possible to end those stubborn processes in this way.

终止进程的最终方法是KILL-SIGKILL PID(KILL-9 PID)。不能忽略SIGKILL信号,因此这必须起作用。然而,由于过于苛刻,以这种方式扼杀进程往往会有后遗症,比如进程使用的资源在退出前没有清理干净。一个常见的例子是以这种方式终止VIM进程后留下的.swp文件。

[En]

The ultimate means to kill a process is kill-SIGKILL PID (kill-9 PID). SIGKILL signals cannot be ignored, so this must work. However, because it is too tough, killing the process in this way will often have sequelae, such as the resources used by the process are not cleaned up before exiting. A common example is the .swp file left behind after killing the vim process in this way.

我们通常使用ail-f命令来查看实时日志,但许多程序生成日志的速度太快,以至于我们跟不上。此时使用

[En]

We usually use the tail-f command to view real-time logs, but many programs generate logs so fast that we can’t keep up. Use at this time

ctrl + s 命令可以暂停日志输出到终端,这样我们就可以仔细的分析当前终端中显示的日志。如果要接着输出日志,可以使用 ctrl + q 命令恢复日志的输出。
这两个命令的原理是:

[En]

The principles of these two commands are:

ctrl + s 会告诉终端暂停,阻塞所有读写操作,即不转发任何数据,只有按了 ctrl + q 后,才会继续。这个功能应该是历史遗留的产物,以前终端和服务器之间没有流量控制功能,所以有可能服务器发送数据过快,导致终端处理不过来,于是需要这样一个命令告诉服务器不要再发了,等终端处理完了后再通知服务器继续。

Original: https://www.cnblogs.com/sparkdev/p/11980732.html
Author: sparkdev
Title: Linux job control

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/7231/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部