スクリプトでは kill は機能しませんが、端末で動作するのはなぜですか?

スクリプトでは kill は機能しませんが、端末で動作するのはなぜですか?

私の問題を説明するために設計された次のスクリプトがあります。

#!/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.
 */

おすすめ記事