当后台进程结束时安全地终止前台进程

当后台进程结束时安全地终止前台进程

有两个脚本,第一个在后台,第二个在前台:

trap "ret=\$?; rm -f pipe1 pipe2; exit \$ret" EXIT INT TERM QUIT
my.bin > pipe1 < pipe2 &
my-term.sh pipe1 pipe2

my-term.sh通过 stdin/stdout 与用户交互(就像 CLI 终端程序):

while read -ep "prompt> " l; do echo $l; done

my.bin只需exit 0脚本即可模拟。

my-term.sh如果my.bin因任何原因退出如何终止?

什么有效:

trap "ret=\$?; rm -f pipe1 pipe2; exit \$ret" EXIT INT TERM QUIT
(my.bin > pipe1 < pipe2; kill -9 $$) &
my-term.sh pipe1 pipe2

但它可能会停止my-term.sh清理。怎样做才正确呢?

答案1

尝试一系列信号,如果其中一个失败,请等待三秒钟(睡眠时间可能会根据应该my-term.sh执行的操作进行调整),然后尝试另一个:

(my.bin > pipe1 < pipe2; x=$$ ; \
 for sig in SIGTERM SIGINT SIGQUIT SIGABRT SIGKILL ; \
 do kill -${sig} $x && break ; sleep 3s ; done ; ) &
my-term.sh pipe1 pipe2

相关内容