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
(以及由它启动的任何进程)在以下情况下完全终止:
我如何执行上述规定?这是由 shell 自动处理的吗?
shell 绝对不会自发地终止其子进程 \xe2\x80\x94\xc2\xa0 毕竟后台作业应该在后台运行并且不关心其父进程的生命。(在某些情况下,交互式 shell 会在退出 \xe2\x80\x94\xc2\xa0 时终止其子进程,这并不总是可取的,因此nohup
。)
您可以让 shell 脚本在退出或被可捕获信号终止时终止其后台作业。记录作业的进程 ID,并从陷阱中杀死它们。请注意,这只会杀死作业(如在后台启动的原始进程),而不是其子进程。
\n\njobs=()\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