を無視します終了しますが、このスクリプトによって示されるように、彼らは、ありません。sudoは私はこれが動作しない理由を把握しようとしている同じスクリプトから送信されSIGTERM
:私は(キャッシュされたsudo
credsをして)、それを実行すると、この出力を生成する
#!/bin/bash
sudo sleep 60 &
sudo_pid=$!
sudo kill $sudo_pid
if ps -p $sudo_pid > /dev/null; then
sudo kill $sudo_pid
else
echo "No sudo process running"
exit 1
fi
if ps -p $sudo_pid > /dev/null; then
echo "sudo (pid $sudo_pid) is still running"
ps -F $sudo_pid
else
echo "sudo successfully killed"
fi
スクリプトが完了した後、それは同じコマンドでそれを殺すために可能である(とsudo sleep 60
がまだ実行されている):
[email protected]:~$ ps -F 46199
UID PID PPID C SZ RSS PSR STIME TTY STAT TIME CMD
root 46199 1 0 14764 3984 3 13:37 pts/0 S 0:00 sudo sleep 60
[email protected]:~$ sudo kill 46199
[email protected]:~$ ps -F 46199
UID PID PPID C SZ RSS PSR STIME TTY STAT TIME CMD
[email protected]:~$
は私が気づくことso.sh
スクリプトが終了した後、親プロセスIDのsudo sleep 60
がスクリプトからinit
プロセスに変更されました。これは重要だと思います。また、so.sh
スクリプトが実行されている間に別のシェルからsudo sleep 60
プロセスを正常に終了することもできます。
私も(kill
のデフォルトSIGTERM
ではなく)スクリプトでsudo kill -ABRT
を使用すると、正常sudo
プロセスを殺すので、私はそれがsudo
がSIGTERM
の処理方法とは何かを持っていると仮定しないことに気づきました。しかし、manページに基づいて、私はそれが何か特別なことをやるべきとは思わない:
Signal handling
When the command is run as a child of the sudo process, sudo will relay
signals it receives to the command. The SIGINT and SIGQUIT signals are
only relayed when the command is being run in a new pty or when the sig‐
nal was sent by a user process, not the kernel. This prevents the com‐
mand from receiving SIGINT twice each time the user enters control-C.
manページに記載されたSIGTERM
の唯一の特別な処理がsignals that were sent by the command it is running
のためです。ここのケースではありません。さらに、私はps -o blocked,caught,ignored,pending
に上記のスクリプトでps -F
を変更し、それを出力
sudo sleep 60
プロセスではありません
sudo (pid 46429) is still running
BLOCKED CAUGHT IGNORED PENDING
0000000000000000 00000001800b7a07 0000000000000000 0000000000000000
?
私はいくつかの回避策(setsid
、sudo -b
、子sleep
プロセスではなく、親sudo
プロセスを殺す)を作ってみたので、私は別のアプローチの答えを探していませんよ。私はちょうどここで何が起こっているのか理解したい。
ケースでは、重要:
[email protected]:~$ uname -a
Linux ubuntu 4.13.0-16-generiC#19-Ubuntu SMP Wed Oct 11 18:35:14 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[email protected]:~$ sudo --version
Sudo version 1.8.20p2
Sudoers policy plugin version 1.8.20p2
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.20p2
信号に関する追加情報をありがとう! 'sudo'は、' sudo'の子プロセスに由来するシグナルを伝播しないので、 'SIGTERM'をキャッチしていることに意味があります。もし私が本当に知りたいのであれば、ソースに掘り下げなければならないだろうと思う。 – Jon