zoukankan      html  css  js  c++  java
  • 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 这个值在功能上和作业号 %? 相类似。
    如果设为任何其它的值,则必须是一个已停止作业名称中的开头部分;这和作业号 % 在功能上是类似的。

  • 相关阅读:
    前端面试题目汇总摘录(HTML 和 CSS篇)
    The Road to learn React书籍学习笔记(第三章)
    The Road to learn React书籍学习笔记(第二章)
    算法复习:动态规划
    算法复习:回溯法
    算法复习:图
    算法复习:二叉树专题
    算法复习:最短路Dijkstra
    算法复习:BFS与DFS
    算法复习:标记数组 / 数组
  • 原文地址:https://www.cnblogs.com/BradMiller/p/11858237.html
Copyright © 2011-2022 走看看