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

进程组(job)

执行一个命令会创建一个或多个进程,这些进程被称为一个进程组(process group)。进程组中包含一个或多个进程,每个进程都会属于一个进程组,进程组也叫 job。

每个进程组都有一个领头进程(process group leader),领头进程的 PID 就是进程组的 ID(process group ID,PGID),我们可以通过 ps 命令查看进程的 PGID:

$ ps -o pid,ppid,pgid,comm | cat

红框中的两个进程属于同一进程组(通过管道符连接的进程属于相同的进程组)。这个进程组中的领头进程为 16823,因此它的 PID 成了进程组的 PGID。我们可以通过下图来理解这几个进程之间的关系:

领头进程可以先退出,这时进程组依然存在并且 PGID 也不会发生变化。在进程组中的所有进程都退出后,进程组的证明周期结束。
将进程划分到进程组中的主要原因是可以对它们进行统一的管理,说白了就是同时发信号给组内的所有进程,这就是我们接下来要介绍的 job 管理。

Job 管理

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

输出的第一列方括号中的数字表示 jobID,第二列 Stopped 表示 job 当前的状态,第三列则表示该 job 执行的命令。
使用 jobs 命令可以查看当前会话中的的所有 jobs,此时执行 jobs 命令,输出的结果和上面一样:

& 符
在命令的后面加上 & 符号,可以直接让 job 运行在后台:

$ sleep  &

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

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

$ fg %

此时 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 为进程的 jobID)来终止进程。kill 命令默认向进程发送 SIGTERM 信号,程序一般会在 SIGTERM 信号的处理函数中正常地终止程序并执行资源清理工作。既然 SIGTERM 信号能够被程序处理,那么它也能够被忽略,所以也无法通过这种方式结束那些顽固的进程。

杀死进程的终极手段是 kill -SIGKILL PID(kill -9 PID)。SIGKILL 信号是不能被忽略的,所以这一招肯定管用。但是由于它过于强硬,使用这种方式杀死进程后往往会有后遗症,比如进程使用的资源没有在退出前清理干净,常见的例子是用这种方法杀死 vim 进程后会遗留下 .swp 文件。

暂停 tail 命令的输出

我们一般会使用 tail -f 命令查看实时的日志,但很多程序产生日志的速度非常快以至于我们跟不上节奏。此时使用
ctrl + s 命令可以暂停日志输出到终端,这样我们就可以仔细的分析当前终端中显示的日志。如果要接着输出日志,可以使用 ctrl + q 命令恢复日志的输出。
这两个命令的原理是:
ctrl + s 会告诉终端暂停,阻塞所有读写操作,即不转发任何数据,只有按了 ctrl + q 后,才会继续。这个功能应该是历史遗留的产物,以前终端和服务器之间没有流量控制功能,所以有可能服务器发送数据过快,导致终端处理不过来,于是需要这样一个命令告诉服务器不要再发了,等终端处理完了后再通知服务器继续。

参考:
Job Control

Linux job control的更多相关文章

  1. Linux Pin Control 子系统

    Pin Control Subsystem是Linux内核抽象出的一套用于控制硬件引脚的一套子系统. 1.源文件列表 源码位于linux/drivers/pinctrl目录下,源文件列表如下: 文件名 ...

  2. Docker之Linux Cgroups

    Linux Cgroups介绍 上面是构建Linux容器的namespace技术,它帮进程隔离出自己单独的空间,但Docker又是怎么限制每个空间的大小,保证他们不会互相争抢呢?那么就要用到Linux ...

  3. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  4. linux 下使用 tc 模拟网络延迟和丢包-使用 linux 模拟广域网延迟 - Emulating wide area network delays with Linux

    tc 是linux 内置的命令:使用man pages 查看 我们看到,其功能为 show / manipulate traffic control settings,可对操作系统进行流量控制: ne ...

  5. Linux session(会话)

    笔者在前文<Linux job control>中介绍了进程组(job)的概念以及常见的 job control 操作,本文接着介绍 session 的概念.本文中演示部分使用的环境为 u ...

  6. 【原创】(四)Linux进程调度-组调度及带宽控制

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  7. TC Hash Filter

    Overview The u32 filter allows you to match on any bit field within a packet, so it is in some ways ...

  8. Open vSwitch FAQ (三)

    Quality of Service (QoS) Q: How do I configure Quality of Service (QoS)? A: Suppose that you want to ...

  9. True Zero Downtime HAProxy Reloads--转载

    原文地址:http://engineeringblog.yelp.com/2015/04/true-zero-downtime-haproxy-reloads.html HAProxy: Corner ...

随机推荐

  1. seq2seq+attention解读

    1什么是注意力机制? Attention是一种用于提升Encoder + Decoder模型的效果的机制. 2.Attention Mechanism原理 要介绍Attention Mechanism ...

  2. WORKGROUP无法访问,您可能没有权限使用网络资源,请与这台服务器的管理员联系以....

    解决方法 1.启用Guest账号 在很多情况下,为了本机系统的安全,Guest账户是被禁用的,这样就无法访问该机器的共享资源,因此必须启用Guest账户. 笔者以Windows XP系统为例进行介绍. ...

  3. 对比讲解lambda表达式与传统接口函数实现方式

    在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应该都掌握了,实际上还是存在大量的 ...

  4. 【IT教程-Oracle】尚观Oracle白金级入门教程

    链接: https://pan.baidu.com/s/1GMncQN6mpgaH3hZQjGelaA 提取码: qu6j

  5. 分布式id生成方案总结

    本文已经收录自 JavaGuide (60k+ Star[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.) 本文授权转载自:https://juejin.im/post/ ...

  6. RocketMQ实战:生产环境中,autoCreateTopicEnable为什么不能设置为true

    1.现象 很多网友会问,为什么明明集群中有多台Broker服务器,autoCreateTopicEnable设置为true,表示开启Topic自动创建,但新创建的Topic的路由信息只包含在其中一台B ...

  7. strGame:博弈论,trie

    挺有意思的一道题.初探博弈论. 最好自己思考? 我们先考虑只有1轮游戏的情况. 这题明显要在字符串上一位一位地走,所以对字符串建立起trie. 最终建立起的trie的叶节点就是必败位置了. 对于非叶节 ...

  8. VirtualBox6安装CentOS7设置静态IP

    安装virtualbox后安装centos7, 这里就不在赘述了, 网上有很多教程 先关闭虚拟机, 按照如下设置配置网络 这里需要使用双网卡, 我们在开启第二个网卡, 如下所示 之后开启虚拟机, 进行 ...

  9. margin:0 auto为何会居中?

    margin: 0 auto;为何会居中呢??? 一开始的学习html的时候,就是只知道块级元素margin:0 auto就能居中 但是后来就很好奇 margin: auto 0;为何不能垂直居中? ...

  10. Docker 开篇2 | 树莓派安装docker 续

    问题1:安装后出现错误Error! The dkms.conf for this module includes a BUILD_EXCLUSIVE directive which does not ...