2017-12-29 25 views
1

を無視します終了しますが、このスクリプトによって示されるように、彼らは、ありません。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プロセスを殺すので、私はそれがsudoSIGTERMの処理方法とは何かを持っていると仮定しないことに気づきました。しかし、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を変更し、それを出力

そのSIGTERMがブロックされたり、無視されていないことを示すように思われるので、なぜ終了ばかり sudo sleep 60プロセスではありません
sudo (pid 46429) is still running 
     BLOCKED   CAUGHT   IGNORED   PENDING 
0000000000000000 00000001800b7a07 0000000000000000 0000000000000000 

私はいくつかの回避策(setsidsudo -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 

答えて

1

任意の信号の信号マスクビットがある:とにかく1~32の範囲で標準信号の

(1ULL << ((signal_number) - 1)) 

(;追加の信号がです「リアルタイム」の信号セットであり、同じ概念が適用されるが、やや異なって扱われる)。だから、CAUGHTマスクの興味深い部分はある:ある

...7a07 

(+キャッチため、 - 拡大部分では、キャッチされないため):

xxx7: signals 1, 2, 3, but not 4: +SIGHUP +SIGINT +SIGQUIT -SIGILL 
xx0x: not 5-8:     -SIGTRAP -SIGABRT -SIGBUS -SIGFPE 
xaxx: not 9, 10, not 11, 12:  -SIGKILL +SIGUSR1 -SIGSEGV +SIGUSR2 
7xxx: 13, 14, 15, not 16:   +SIGPIPE +SIGALRM +SIGTERM -SIGSTKFLT 

(あなたがいる場合、残りのデコード続けることができますあなたは好きです; Linux固有のシグナル番号については/usr/include/asm-generic/signal.hを参照してください;数字の定義はOSXとBSDで異なりますが、技術は同じです:捕捉されたかブロックされたか、

したがって、sudoSIGTERMを捕まえていますが、SIGABRTを捕まえていないことを意味します。 SIGTERMが渡されないという事実は、sudoコードそのものと関係があります。ソース(apt-get source sudo)には、信号処理を行うためのかなり複雑なコードがあります。興味深いデバッグトリックをsudo configファイルで有効にして、何が起こっているのかを追跡するのに役立ちます。

+0

信号に関する追加情報をありがとう! 'sudo'は、' sudo'の子プロセスに由来するシグナルを伝播しないので、 'SIGTERM'をキャッチしていることに意味があります。もし私が本当に知りたいのであれば、ソースに掘り下げなければならないだろうと思う。 – Jon

関連する問題