7.作业控制
本节讨论作业控制是什么、它怎么工作、以及 Bash 里面怎么使用这些功能
7.1 作业控制基础
作业控制是指有选择的停止(暂停)并在后来继续(恢复)执行某个进程的能力。
通常,用户通过 Bash和系统的终端驱动共同提供的功能,在交互式的界面上使用作业控制。
shell 会把每个管道都和一个关联。它会维护一个当前正在执行的作业表,这个表可以用 jobs 命令列出。
当 Bash 异步的启动一个作业时,它会打印一条如下的信息:[1] 25647
表示这个作业的作业号是 1,而这个作业所关联的管道中最后一个进程的进程号是 25647。
一个管道中的所有进程都是同一作业的组成部分。Bash 使用作业这种抽象的机制作为作业控制的基础。
为了便于实现作业控制的用户界面,操作系统维护一个叫当前终端进程组号的概念。
这个进程组的成员(即进程组号与当前终端进程组号相等的进程)接收诸如 SIGINT 的键盘信号,它们被称为前台进程。
而后台进程是指那些进程组号与终端进程组号不同的进程,它们不受键盘信号的影响。
只有前台进程才可以读取和写入终端。
如果后台进程试图读取(或写入)终端,终端驱动就会向它们发送一个 SIGTTIN 或 SIGTTOU信号;这时,如果没有捕获这个信号,这个进程就会暂停。
如果运行 Bash 的操作系统支持作业控制,Bash 就会提供作业控制的功能。
在某个进程运行时输入暂停字符(通常是Ctrl+Z),这个进程就会停止并且把控制权返回给 Bash。
如果输入延迟暂停字符(通常是 Ctrl+Y),这个进程就会在试图从终端读取输入时停止并且把控制权返回给 Bash。
这时用户就可以控制该作业的状态:用 bg 命令在后台继续运行作业,用 fg 命令在前台继续运行作业,或者用 kill 命令结束作业。
Ctrl+Z会立即生效,并有一个副作用,即丢弃剩余的输出和尚未提交的输入。
有好多方法来表示 shell 中的作业。
"%"字符引导一个作业指示(jobspec)。作业号 n 可以记为 %n。
%% 和 %+ 代表 shell 概念中的当前作业,即前台中停止的最后一个作业或后台中最后一个开始的作业。
单个%(后面没有作业指示)也表示当前作业。而前一个作业可以用 %- 来表示。
如果只有一个作业,则 %+ 和 %- 都可以表示它。
在 jobs 命令的输出中,当前作业总是标为 +,而前一个作业总是 -。
还可以用启动时名称中的前缀来表示一个作业,或者用命令行中的子字符串。
例如,%ce 表示已停止的进程 ce。而使用 %?ce 却表示任何包含字符串 ce 的命令。
如果前缀或子字符串匹配多个作业,Bash 就会报错。
简单的称呼一个作业可以把它调到前台,例如,%1 和 fg %1 是同义的,它们都把后台中的第一个作业调到前台。
类似的,%1 & 可以在后台继续执行第一个作业,它和 bg %1 是等价的。
shell 会即时知悉作业状态的改变。
通常,Bash 会等待打印提示符时再报告作业状态的改变,以避免干扰用户的其它输出。
如果打开了内部命令 set 的"-k"选项,Bash 会立即报告状态的改变。
如果有 SIGCHLD 陷阱,则在每个子进程退出时执行。
如果作业停止时试图退出 Bash (如果打开了 checkjobs 选项,则也包括作业正在运行时),shell 就会打印警告信息;
如果打开了 checkjobs 选项,则列出每个作业和它们的状态;
如果没有打开 checkjobs 选项,则可以用 jobs 命令查看它们的状态。
如果没有输入其它命令而再次试图退出,Bash 就不再打印警告信息,并结束所有已停止的作业。

7.2 作业控制内部命令
A.bg
bg [作业指示 ...]
在后台继续执行每个暂停的作业指示,就好像启动它们时带有"&"一样。
如果没有给定作业指示,则使用当前的作业。
返回状态是零,除非运行时没有启用作业控制,或者虽然启用了作业控制而有些作业指示没有找到或它们在启动时没有使用作业控制,这时返回状态是非零。

B.fg
fg [作业指示]
在前台继续执行作业指示,并把它作为当前作业。
如果没有给定作业指示,则使用当前的作业。
返回状态是放到前台的命令的返回状态;除非运行时没有启用作业控制,或者虽然启用了作业控制而有些作业指示没有找到或它们在启动时没有使用作业控制,这时返回状态是非零。

C.jobs
语法一:jobs [-lnprs] [作业指示]
功能:列出活动和作业。如果给定作业指示,则只显示该作业的信息。否则,列出全部作业的状态信息。
选项含义如下:
-l 除了正常要显示的信息外,还列出进程号。助记词: List, 列出
-n 只显示上次把状态通知用户以后,已经改变了状态的作业。助记词: Notify, 上次通知
-p 只列出作业进程组中首领进程的进程号。助记词: Process, 进程号
-r 只显示正在运行的作业。助记词: Running, 正在运行
-s 只显示已经停止的作业。助记词: Stopped, 已停止
语法二:jobs -x 命令 [参数表]
功能:如果指定了"-x"选项,jobs 就会把命令或参数表中的作业指示用对应的进程组号替换,然后把参数表传给命令并执行它,最后返回这个命令的返回状态。

D.kill
kill [-s 信号指示] [-n 信号数字] [-信号指示] 作业指示或进程号
kill -l [退出状态]
把信号指示或信号数字指定的信号发送给作业指示或进程号指定的进程。
信号指示是个不区分大小写的信号名称,或者是个信号代码;信号数字是个信号代码。
如果没有指定信号指示或信号数字,则使用 SIGTERM。
"-l"选项助记词: List, 列出,可以列出所有信号名称。
如果"-l"选项还带有一些参数,则只列出这些参数对应的信号,这时返回状态是零。
退出状态是个信号代码或者是能导致进程结束并返回这个退出状态的信号。
如果至少成功发送一个信号,则返回状态是零;如果发生错误,或遇到了无效的选项,则返回非零。

E.wait
wait [作业指示或进程号 ...]
等待由作业指示或进程号指定的进程退出并返回等待的最后一个命令的退出状态。
如果给定作业指示,则等待这个作业的所有进程。
如果没有给定参数,则等待当前所有的活动子进程,其返回值为零。
如果作业指示或进程号都没有指定 shell 的活动子进程,则返回状态是 127。

F.disown
disown [-ar] [-h] [作业指示 ...]
如果没有选项,则从活动作业表中移除第一个作业指示。
如果指定了"-h"选项助记词: Hang, 挂起,则并不移除作业,而是给它一个标志,使得 shell 在接收到 SIGHUP 信号时不会把这个信号转发给它。
如果没有指定作业指示,并且也没有指定"-a"或"-r"选项,则使用当前作业。
如果没有指定作业指示,则"-a"选项助记词:All, 所有,将移除或标志所有作业;而"-r"限制只操作正在运行的作业。

G.suspend
suspend [-f]
暂停执行当前的 shell,直到向它发送 SIGCOUNT 信号。
登录 shell 不可以暂停;但是可以使用"-f"选项助记 词: Force, 强制,来强制暂停。
注意:如果没有启用作业控制,内部命令 kill 和 wait 就不能把作业指示作为参数,它们只能接受进程号。

7.3 作业控制变量
A.auto_resume
这个变量控制 shell 与用户和作业控制的交互。
如果这个变量存在,则没有重定向且只包含单个单词的简单命令就被当作恢复已有作业的候选命令。
这时不允许有岐义;如果有多个命令以输入的字符串开头, 则选择最近访问的作业。
在这种情况下,对于已经停止的作业,其名称就是启动时的命令行。
如果把这个变量的值设为 exact,则输入的字符串必须和已停止的作业名完全一致;
如果把它设为 substring,输入的字符串只要和已停止作业名的部分匹配就可以了;
substring 这个值在功能上和作业号 %? 相类似。
如果设为任何其它的值,则必须是一个已停止作业名称中的开头部分;这和作业号 % 在功能上是类似的。

7.bash作业控制的更多相关文章

  1. 自学Linux Shell15.2-作业控制命令(jobs/bg/nice/renice/at/atp/atrm/crontab)

    点击返回 自学Linux命令行与Shell脚本之路 15.1-作业控制命令(jobs/bg/nice/renice/at/atp/atrm/crontab) 1  控制作业 1.1查看作业 (jobs ...

  2. Bash的作业控制

    作业控制是bash Shell提供的一项强大功能,它允许你选择在前台还是后台运行程序,即作业. 1.开启bash的作业控制功能 #set -o monitor或#set -m 2.显示在后台运行的作业 ...

  3. 【CentOS】学习Bash

    一.特性 命令历史  history , !! , !$ , !字符 , !n (n为第几条命令) Tab可以补全文件路径或者命令 alias a="b",  unalias a ...

  4. 常见linux命令释义(第四天)——bash部分

    学linux的时候,我跳过了一些很重要的东西.比如分区.还有vim的深入学习.分区没有学习是因为我装的是虚拟机,不知道是什么原因,格式化分区不能正常显示.至于vim,简单的增删改查我已经了解了.能够顺 ...

  5. 跟着鸟哥学Linux系列笔记3-第11章BASH学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...

  6. 终端&作业控制&会话启动过程

    进程组 每个进程除了有个进程id外,还属于一个进程组.进程组是一个或者多个进程的集合.通常他们与同一个作业相关联,可以接受来自同一终端的信号.进程组id等于其进程组长id.进程组的终止与进程组长是否存 ...

  7. bash内部命令-1

    外置命令 date expr seq nohup tput bash内置命令 trap set shopt date Linux时钟分为系统时钟(System Clock)和硬件(Real Time ...

  8. 第四章:更多的bash shell命令

    第四章:更多的bash shell命令 监测程序 ps (其他ps内容见#1 ) Unix风格的ps命令参数 参数 描述 -A 显示所有进程 -N 显示与指定参数不符的所有进程 -a 显示除控制进程( ...

  9. Linux基本操作 9----- 认识与学习bash

    一 认识bash这个shell 1 管理整个计算机硬件的其实就是操作系统的内核,这个内核是需要被保护的,所以我们一般用户就只能通过shell来跟内核通信,以让内核达到我们所想打到的工作. 2 只要能够 ...

随机推荐

  1. 理解Cookie和Session

    HTTP 无状态协议 HTTP 本身是一个无状态的连接协议,无状态的意思是:每条请求/响应都是独立进行的,服务端每处理完一个客户端的请求之后就会断开连接,并且每条请求/响应与其之前(或之后)的请求/响 ...

  2. Qt那点事儿(三) 论父对象与子对象的关系

    第三回 父与子 70后的道友都应该看过这么一部片子叫做<<父子情深>>.讲述的是一个小男孩患了绝症,父亲为了满足他的愿望,让已关门的游乐园为他们父子俩重新开放.在游乐园尽情地玩 ...

  3. Python接口测试-模块引用与映射

    PyCharm中发现模块引用老是有各种问题 可以用映射来解决,例如需要调用登录模块里面的东西的时,可以这样处理: 登录模块:1-login.py import this import requests ...

  4. DB2 SQL 错误(SQLCODE:-964,SQLSTATE:57011)处理方法

    故障现象描述: 执行 SQL 语句时,出现类似如下错误消息. 指令 SQL:insert into t_stat_file_temp SQLSTATE:57011,供应商错误代码:-964 DB2 S ...

  5. LaTeX统计文章字数

    今天学会了用LaTeX命令统计文章字数,命令如下: textcount doc_full_path.tex 效果如下:

  6. Oracle 本地创建多个实例并创建多个监听(只能在服务端弄,不可在客户端)

    注意:监听必须在客户端创建,在客户端创建,会报错. 1.创建监听 通过 Net Configuration Assistant  创建监听,设置端口: 注意:此监听创建完后,服务列表里面并没有此服务的 ...

  7. ceph常用命令(3)

    1.查看集群配置信息 ceph daemon /var/run/ceph/ceph-mon.$(hostname -s).asok config show 2.在部署节点修改了ceph.conf文件, ...

  8. Vue 组件中 data 为什么必须是函数

    原文地址 vue组件中的data必须是函数 类比引用数据类型 Object是引用数据类型,如果不用function 返回,每个组件的data 都是内存的同一个地址,一个数据改变了其他也改变了; jav ...

  9. Unreal Engine* 4/英特尔® VTune™ Amplifier 使用指南

    借助英特尔 VTune Amplifier,可以通过单一易用的分析界面获得先进的分析功能.UE4 和英特尔 VTune Amplifier 相互配合,支持调查代码并进行分析,从而在多个内核上顺畅运行. ...

  10. 通过火狐谋智查询API

    谋智中文版网址 https://developer.mozilla.org 示例 site: developer.mozilla.org window 通过百度高级用法查API site: 网址 搜索 ...