bash: 什么是作业规范(jobspec)?

34

2
这是一个与编程无关的概念[因此相关问题应该在SuperUser上提问],因为它是非交互使用中未启用功能的一部分。 :) - Charles Duffy
@CharlesDuffy 这是否适用于超级用户还有待商榷。作业控制内置程序确实可供脚本使用(例如,您可以执行 wait %1)。一个使用示例是:一个将视频转码数千个文件的脚本。该脚本在具有8个核心的计算机上运行。该脚本使用作业控制来管理8个工作进程,在旧进程完成时启动新进程。我通常会在perl中执行此类操作,但也可以在bash中执行。 - Craig Estey
1
@CharlesDuffy我刚在一个具有价值hB的脚本中执行了wait %1命令,并且它奏效了。在转码示例中,您将循环检查“jobs”输出的更改,而不是等待[因为您想在任何待处理作业完成时启动新作业,而不是所有8个作业都完成时]。可能有更常见的方法来完成它,但这是一种有效的方式。 - Craig Estey
@CraigEstey,...但是你如何阻塞直到某个进程退出?如果你只是在循环中轮询,传统的方法是使用kill -0针对PID...但实际上,我倾向于将这种情况称为xargs -P 8的工作,或者任何其他可以等待SIGCHLD而不需要轮询的东西。 - Charles Duffy
1
@CharlesDuffy 在循环中睡眠。我的实际脚本会输出包含已用时间 + 预计剩余时间(基于来自 /proc/pid/fd/... 的输入文件位置)的作业进度窗口,因此需要定期唤醒(即轮询)。此外,它会监视一个目录以获取新的“作业请求”、取消请求和更高优先级的作业。在 Perl/Python 中很容易实现,在 bash 中较难,但是也可行。循环将执行以下操作:检查新作业,检查 jobs 状态变化,输出进度,完成文件/作业,启动下一个文件的工作者,然后睡眠。它可能需要暂停优先级较低的作业并开始优先级较高的作业。此外,它也可以在不同的计算机上运行等。 - Craig Estey
显示剩余2条评论
1个回答

35

Greg的Bash指南中的作业控制部分 如下所述:

作业规范或“ jobspec ”是引用组成作业的进程的一种方式。作业规范可以是以下内容:

  • %n 表示作业号为 n 的作业。
  • %str 表示由以 str 开头的命令启动的作业。如果有多个此类作业,则出错。
  • %?str 表示由包含 str 的命令启动的作业。如果有多个此类作业,则出错。
  • %%%+ 表示当前作业:最近在后台启动或从前台暂停的作业。如果未给出作业规范,则 fg 和 bg 将操作此作业。
  • %- 表示前一个作业(当前作业之前的作业)。

当你没有亲自编写某些内容时,应该进行归属 -- 不仅要附上链接,还要用文字清楚地说明哪些内容是原创部分,哪些不是。 - Charles Duffy
@Charles Duffy明白了,我会相应地进行编辑。谢谢。 - Rany Albeg Wein
我不确定是否应该称Bash指南为“文档”,尽管有时我认为它应该是。=) - Etan Reisner
@EtanReisner,嘿,我的错 - 我没有仔细看链接的去向,以为它是手册的另一部分。 :) - Charles Duffy
在Bash中,百分号(%)本身也是指当前作业。顺便说一下,Bash手册足够好,但不太全面,而且缺少一些示例。 - rosshjb
有人能添加一个如何设置“jobspec”并通过其“jobspec”查找进程的示例吗? - mgutt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接