プロセスがS状態(中断可能なスリープモード)のときに終了信号をキャプチャします。

プロセスがS状態(中断可能なスリープモード)のときに終了信号をキャプチャします。

プロセスグループは次のとおりです。(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 1234process1のみが終了しますが、子プロセスは終了しません。だから私は終了する前にサブプロセスを終了する関数をProcess1に書きました。

トラップを使用してこの関数を呼び出すと、次のようになります。

trap function_name SIGTERM

kill 1234または送信すると、トラップ関数は私が作成した関数を呼び出す信号をキャプチャしませんkill -15 1234kill -s TERM 1234

もう一度、process1からトラップコマンドを削除して呼び出すと、kill 1234procces1が終了します。

どちらもバックグラウンドで実行している場合、実行制御は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を呼び出すと、トラップコマンドによって信号が取得されます。

ベストアンサー1

おすすめ記事