我有一个命令需要在脚本执行期间在后台运行。意思是直到脚本的其余部分成功运行或遇到Ctrl+c或以其他方式过早终止。
问题是,如果我使用command &
,即使在脚本终止后它也会继续运行,直到启动它的终端被终止。
有没有办法将后台命令绑定到前台脚本?
我有一个命令需要在脚本执行期间在后台运行。意思是直到脚本的其余部分成功运行或遇到Ctrl+c或以其他方式过早终止。
问题是,如果我使用command &
,即使在脚本终止后它也会继续运行,直到启动它的终端被终止。
有没有办法将后台命令绑定到前台脚本?
这个答案:
一个基本的方法是将此行放在主脚本的末尾,但脚本可能永远不会到达它。更高级的方法是在主脚本中创建一个陷阱:
在启动后台作业之前定义陷阱。
kill
即使主脚本过早终止,该命令也会运行(除非它被强制终止,例如使用 SIGKILL)。kill
但请记住,您的工作可能会忽略它从陷阱中获得的 SIGTERM 。如果您只想终止特定的后台作业(而不是所有后台作业),请将其 PID 存储在变量中并在陷阱中使用该变量:
我认为有一个缺陷:如果主外壳在两者之间终止
your_job &
,jpid="$!"
那么陷阱将无法$jpid
使用。中没有这样的缺陷kill $(jobs -p)
。