私の問題を説明するために設計された次のスクリプトがあります。
#!/bin/bash
set -eux
sudo sleep 120 &
spid=$!
sleep 1
sudo kill $spid
wait $!
これは印刷されます
$ ./test.sh
+ spid=21931
+ sleep 1
+ sudo sleep 120
+ sudo kill 21931
+ wait 21931
その後、時間が経つwait
まで続けます。sleep 120
ただし、sudo kill 21931
他の端末で実行すると、眠っているプロセスはすぐに終了します。sudo kill $spid
スクリプトの行でも、スリーププロセスがすぐに終了することが期待されています。これがうまくいかないのはなぜですか、それをどのように機能させるのですか?
(おそらく関連があるかもしれません。Ubuntu 15.10のbash 4.3.42とdash 0.5.7でこの動作を見ました。)
ベストアンサー1
理由は次のとおりです。ソースコード修道:
/*
* Do not forward signals sent by a process in the command's process
* group, as we don't want the command to indirectly kill itself.
* For example, this can happen with some versions of reboot that
* call kill(-1, SIGTERM) to kill all other processes.
*/