プロセスグループは次のとおりです。(ps -ejH
)
xxxx xxxx xxxx ? 00:00:00 sshd
yyyy yyyy yyyy ? 00:00:00 sshd
8713 8713 8713 pts/0 00:00:00 bash
1234 1234 1234 ? 00:00:00 Process 1
5678 1234 1234 ? 00:00:00 openvt
3789 3789 3789 tty4 00:00:00 Python process
プロセスの状態は次のとおりです。
Process1: Ss [中断可能なスリープとセッションリーダー]
openvt: S [睡眠を中断できる]
pythonプロセス:Ss + [スリープとセッションリーダーとフォアグラウンド実行プロセスを中止することができる]
私は /dev/pts0 [8713] bash 端末で作業しています。
私が送信するとkill 1234
process1のみが終了しますが、子プロセスは終了しません。だから私は終了する前にサブプロセスを終了する関数をProcess1に書きました。
トラップを使用してこの関数を呼び出すと、次のようになります。
trap function_name SIGTERM
kill 1234
または送信すると、トラップ関数は私が作成した関数を呼び出す信号をキャプチャしませんkill -15 1234
。kill -s TERM 1234
もう一度、process1からトラップコマンドを削除して呼び出すと、kill 1234
procces1が終了します。
どちらもバックグラウンドで実行している場合、実行制御はprocess1ではなくopenvtにあり、process1はこのkillコマンドを受け取らないためです。
今、process1にkillコマンドを受け取る方法は何ですか?
PS:ここでopenvtはPythonプロセスを実行するために新しい仮想端末を開きます。これを実行するために使用されるコマンドは次のとおりですopenvt -f -s -c 4 -w python_process
。 -wコマンドが完了するのを待ちます。
注: からLinuxマガジンプロセスが中断可能なスリープ状態(例えば、ターミナルI / O待機)にある間に信号が受信されると、カーネルはプロセスを起動して信号を処理します。プロセスが中断せずに眠っている間(たとえば、ディスクI / Oを待っている間)シグナルを受信すると、カーネルはイベントが完了するまでシグナルを延期します。
process1に送信されたKill信号は割り込み可能な省電力状態(S)にありましたが、カーネルが信号を遅らせました。なぜですか?
一つある郵便はがきこれに基づいていましたが、解決されませんでした。
アップデート1:pkill -TERM -p pidコマンドを使用して親プロセスのすべての子プロセスを終了し、kill pidを呼び出すと、トラップコマンドによって信号が取得されます。