脚本完成或被终止后终止子进程

Ame*_*ina 5 kill zsh background-process

假设我有一个如下所示的脚本

#!/usr/bin/env zsh
./subscript.sh &
# do stuff
...
# do more stuff
Run Code Online (Sandbox Code Playgroud)

我希望运行的进程subscript.sh(以及由它启动的任何进程)在以下情况下完全终止:

  1. 上面的脚本退出
  2. 上面的脚本因任何原因被终止。

我如何执行上述规定?这是由 shell 自动处理的吗?

Gil*_*il' 4

shell 绝对不会自发地终止其子进程 \xe2\x80\x94\xc2\xa0 毕竟后台作业应该在后台运行并且不关心其父进程的生命。(在某些情况下,交互式 shell 会在退出 \xe2\x80\x94\xc2\xa0 时终止其子进程,这并不总是可取的,因此nohup。)

\n\n

您可以让 shell 脚本在退出或被可捕获信号终止时终止其后台作业。记录作业的进程 ID,并从陷阱中杀死它们。请注意,这只会杀死作业(如在后台启动的原始进程),而不是其子进程。

\n\n
jobs=()\ntrap \'((#jobs == 0)) || kill $jobs\' EXIT HUP TERM INT\n\xe2\x80\xa6\nsubscript1 & jobs+=($!)\nsubscript2 & jobs+=($!)\n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想确保终止所有进程及其子进程,则需要进行更多规划。一种方法是安排所有进程打开一个唯一的文件。要杀死所有进程,请杀死所有打开该文件的进程。子进程可以通过关闭文件来逃脱。

\n\n
#!/bin/sh\nlock_file=$(mktemp)\nexec 3<"$lock_file"\nyour_script\nstatus=$?\nexec 3<&-\nfuser -k "$lock_file"\nexit $status\n
Run Code Online (Sandbox Code Playgroud)\n