使用 `&` 在后台启动一个命令,并让它随脚本一起消失

使用 `&` 在后台启动一个命令,并让它随脚本一起消失

我有一个命令需要在脚本运行期间在后台运行。这意味着直到脚本的其余部分成功运行或满足Ctrl+c或以其他方式提前终止。

问题是,如果我使用command &,即使脚本终止,它仍会继续运行,直到启动它的终端终止。

有没有办法将后台命令绑定到前台脚本?

答案1

这个答案

对于kill由管理的所有后台作业bash,请执行

kill $(jobs -p)

一种基本方法是将此行放在主脚本的末尾,但脚本可能永远不会到达它。更高级的方法是在主脚本中创建一个陷阱:

trap 'kill $(jobs -p) 2>/dev/null' EXIT

在启动后台作业之前定义陷阱。kill即使主脚本提前终止,命令也会运行(除非强制终止,例如使用 SIGKILL)。

但请记住,您的工作可能会忽略从kill陷阱中获取的 SIGTERM。

如果您只想终止特定的后台作业(而不是所有后台作业),请将其 PID 存储在变量中并在陷阱中使用该变量:

trap 'kill "$jpid" 2>/dev/null' EXIT


your_job &
jpid="$!"

但我认为有一个缺陷:如果主壳在和之间终止your_job &jpid="$!"那么陷阱将无法$jpid使用。 中没有这样的缺陷kill $(jobs -p)

相关内容