使用 set -m 终止子 shell 中的作业

使用 set -m 终止子 shell 中的作业

我有以下 bash 脚本:

#!/bin/bash
set -m
(
    (bin/pnvd &> /dev/null; kill 0) &
    sleep 2
    perl integration-test/fuzz-test.pl || kill 0
    kill %1
)

子 shell 中的前三个命令成功并返回退出状态 0。bin/pnvd在外部终止之前永远不会退出。

但是,在子 shell 中执行第四个命令后,脚本将退出并显示以下输出:

工具/集成测试:第8行:4712终止((bin/pnvd &> /dev/null;kill 0)&睡眠2;perl集成测试/fuzz-test.pl ||杀死0;杀死%1)

和状态码 143。

它看起来好像kill %1杀死了整个进程组,而不仅仅是第一个作业,但是如果我删除它set -m,它就会以状态 0 退出。

我不太感兴趣如何解决这个问题但更多:为什么当子 shell 终止第一个作业时,它是否以状态 143 退出?

答案1

引用自https://stackoverflow.com/a/7294947/402322

另外,如果程序因信号而终止,bash 会通过将退出状态编码为:

128 + signal-number

因此 SIGHUP 产生 129,SIGILL 产生 132,SIGTERM 产生 143,等等。

上面的意思是,你的进程已经收到了 SIGTERM。

您的代码中有三个kills。如果您可以排除kill %1其他两个中的一个,kill 0则会发送 TERM 信号。

相关内容