我有一个命令需要在脚本运行期间在后台运行。这意味着直到脚本的其余部分成功运行或满足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)
。