7.2 作业控制的内建命令(Job Control Bulitins)
bg
bg [jobspec ...]
在后台恢复每一个挂起的作业“jobspec”,就像使用“&”启动该作业一样。如果没有给出“jobspec”,则使用当前作业。返回状态为零。除非在作业控制没有开启时运行作业,或开启了作业控制但没有找到jobspec,或指定的作业启动时不带有作业控制。
fg
fg [jobspec]
在前台恢复作业“jobspec”并且使其成为当前作业。如果没有给出“jobspec”,则使用当前作业。返回状态是置入前台的命令的状态。如果当作业控制没有开启时运行,或开启了作业控制状态并运行时,“jobspec”没有指定一个有效的作业,或“jobspec”指定了一个不带有作业控制的作业,都会返回非零。
jobs
jobs [-lnprs] [jobspec] jobs -x command [arguments]
第一个语法用于列出活动的作业。其选项有以下含义:
| 选项 | 含义 |
|---|---|
| -l | 列出进程 ID 和其通用信息。 |
| -n | 只显示自上一次用户收到作业状态后已改变状态的作业信息。 |
| -p | 只列出作业进程组首个进程 ID。 |
| -r | 只显示运行中的作业。 |
| -s | 只显示已停止的作业。 |
如果给出了“jobspec”,只会输出关于该作业的信息。如果没有给出“jobspec”,则列出所有作业的状态。
如果使用“-x”选项,jobs 会将任何在“command”或“arguments”中找到的“jobspec”替换为相应的进程组 ID,并执行“command”、给其传递“arguments”并返回其退出状态。
kill
kill [-s sigspec] [-n signum] [-sigspec] jobspec or pid kill -l|-L [exit_status]
向由作业规范“jobspec”命名的或进程 ID“pid”指定的进程发送一个由“sigspec”或“signum”指定的信号。“sigspec”既可以是一个大小写不敏感的名字,像 SIGINT(可带有或不带有 SIG 前缀),又可以是一个信号数字编号;而“signum”则是一个信号数字编号。如果“sigspec”和“signum”都没有出现,则使用 SIGTERM。“-l”选项会列出信号名称。如果在“-l”出现时提供了参数,则列出参数所对应的信号名,并且命令的返回状态为零。“exit_status”是一个编号,其用于指定一个信号编号或由信号终结的进程退出状态。“-L”选项等同于“-l”。如果至少有一个信号发送成功了,则返回状态为零。或如果报错或使用了无效的选项,则返回为非零。
wait
wait [-fn] [-p varname] [jobspec or pid ...]
进行等待,直到由进程 ID“pid”或作业规范“jobspec”所指定的子进程退出并且返回最后一条命令的退出状态。如果给出了一个作业规范“jobsepc”,会等待在这个作业中的所有进程。如果没有给出参数,wait 命令会等待所有后台运行的作业和最后执行的替换进程,如果其进程 ID 与变量“$!”相同的话,最后返回状态零。如果提供了“-n”选项,wait 命令会等待一个从“pids”或“jobspecs”列出的单一作业,或如果没有参数给出,则等待任意作业完成并且返回退出状态。如果提供的参数中没有一个是 shell 的子进程,或如果没有提供参数并且 shell 没有非等待子进程,则返回状态为 127。如果提供了“-p”选项,则作业的进程或作业标识返回的退出状态分配给该选项的参数,即变量“varname”。在任意赋值之前变量会进行初始化释放。这只在提供了“-n”选项时才有用。提供了“-f”选项,当开启了作业控制时,会强制 wait 命令在作业返回状态之前等待每一个“pid”或“jobspec”结束,而不是在其改变状态时返回。如果“jobspec”和“pid”都没有指定到一个活动的 shell 子进程,则返回状态 127。
disown
disown [-ar] [-h] [jobspec ... | pid ... ]
在不带有选项使用时,从活动作业表中移除每一个由“jobspec”指定的作业。如果给出了“-h”选项,则不会从表中移除作业,但会被标记,以便如果 shell 接收到 SIGHUP 信号时,该信号是不会发给这个作业。如果未给出“jobspec”,并且既没有提供“-a”选项,也没有提供“-r”选项,则使用当前作业。如果没有提供“jobspec”,“-a”选项意味着移除或标记所有作业;不带有“jobsepc”参数的“-r”选项只对运行中的作业进行操作。
suspend
suspend [-f]
挂起该 shell 的执行,直到 shell 接收到 SIGCONT 信号。不能挂起登录 shell;但“-f”选项可以覆盖该项,并强制挂起。
当未激活作业控制,内建命令 kill 和 wait 是不会接受“jobspec”参数的。只能为它们提供进程 ID 作为参数。