我有以下 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。
您的代码中有三个kill
s。如果您可以排除kill %1
其他两个中的一个,kill 0
则会发送 TERM 信号。