7.bash作业控制
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作业控制的更多相关文章
- 自学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 ...
- Bash的作业控制
作业控制是bash Shell提供的一项强大功能,它允许你选择在前台还是后台运行程序,即作业. 1.开启bash的作业控制功能 #set -o monitor或#set -m 2.显示在后台运行的作业 ...
- 【CentOS】学习Bash
一.特性 命令历史 history , !! , !$ , !字符 , !n (n为第几条命令) Tab可以补全文件路径或者命令 alias a="b", unalias a ...
- 常见linux命令释义(第四天)——bash部分
学linux的时候,我跳过了一些很重要的东西.比如分区.还有vim的深入学习.分区没有学习是因为我装的是虚拟机,不知道是什么原因,格式化分区不能正常显示.至于vim,简单的增删改查我已经了解了.能够顺 ...
- 跟着鸟哥学Linux系列笔记3-第11章BASH学习
跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...
- 终端&作业控制&会话启动过程
进程组 每个进程除了有个进程id外,还属于一个进程组.进程组是一个或者多个进程的集合.通常他们与同一个作业相关联,可以接受来自同一终端的信号.进程组id等于其进程组长id.进程组的终止与进程组长是否存 ...
- bash内部命令-1
外置命令 date expr seq nohup tput bash内置命令 trap set shopt date Linux时钟分为系统时钟(System Clock)和硬件(Real Time ...
- 第四章:更多的bash shell命令
第四章:更多的bash shell命令 监测程序 ps (其他ps内容见#1 ) Unix风格的ps命令参数 参数 描述 -A 显示所有进程 -N 显示与指定参数不符的所有进程 -a 显示除控制进程( ...
- Linux基本操作 9----- 认识与学习bash
一 认识bash这个shell 1 管理整个计算机硬件的其实就是操作系统的内核,这个内核是需要被保护的,所以我们一般用户就只能通过shell来跟内核通信,以让内核达到我们所想打到的工作. 2 只要能够 ...
随机推荐
- LNMP和LAMP的搭建
LNMP 环境:阿里云ubuntu 16 mysql: apt-get install mysql-server mysql-client php: apt-get install php-fpm p ...
- 2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础
目录 基础问题 实验目的 实验内容 实验步骤 实验总结与体会 实验目的 本实践的目标理解常用网络攻击技术的基本原理. 返回目录 实验内容 WebGoat准备工作 SQL注入攻击 命令注入(Comman ...
- 【Spark机器学习速成宝典】推荐引擎——协同过滤
目录 推荐模型的分类 ALS交替最小二乘算法:显式矩阵分解 Spark Python代码:显式矩阵分解 ALS交替最小二乘算法:隐式矩阵分解 Spark Python代码:隐式矩阵分解 推荐模型的分类 ...
- Celery分布式队列学习
1. celery介绍和使用 Celery 是一个 基于python开发的分布式异步消息任务队列(可以简单理解为python多进程或多线程中的queue),通过它可以轻松的实现任务的异步处理.cele ...
- kafka default partitioner java版本和scala版本的不同
scala import kafka.utils._ class DefaultPartitioner(props: VerifiableProperties = null) extends Part ...
- 008-centos6.5搭建web服务【nginx-tomcat8-jre8】
一.机器配置 yum install vim 1.1.Linux最大进程以及打开文件数 ulimit -n和-u可以查看linux的最大进程数和最大文件打开数. ulimit -a 展示所有 临时方法 ...
- jdk1.8 HashMap & ConcurrentHashMap
JDK1.8逐字逐句带你理解ConcurrentHashMap https://blog.csdn.net/u012403290 JDK1.8理解HashMap https://blog.csdn.n ...
- JavaScript高程第三版笔记-DOM扩展
在那个刀耕火种的年代,用过jQuery的都体会到了jQuery带来的便捷,尤其是元素选择器. jQuery(www.jquery.com)的核心就是通过 CSS 选择符查询 DOM 文档取得元素的引用 ...
- UML类图与时序图
UML统一建模语言 结构式图形: 静态图(类图,对象图,包图) 实现图(组件图,部署图) 剖面图 复合结构图 行为式图形: 活动图 状态图 用例图 交互式图形: 通信图 交互概念图(2.0) 时序图( ...
- 【C/C++开发】__stdcall,__cdecl,__fastcall的区别
__stdcall和__cdecl的区别 __stdcall和__cdecl是两种函数名字修饰.(注意是连续的两个下划线) Windows上 windows上不管是C还是C++,默认使用的都是__st ...