Ctrl-C
Centos7の端末で実行されているいくつかのプロセスを中止しようとしています。一部は中断されますが、一部は中断されません。
問題のプロセスの1つ(Process-A)は、アドオンなしのGNU makefileです。一般的な単一ファイル make システムです。もう1つ(プロセスB)は、TCPソケットでリッスンするCアプリケーションです。
以下は、これらの問題のあるプロセスの一部を実行(およびシャットダウン)しながら観察したものです。
- プロセスAは従わない
Ctrl-C
。 strace -fで始まり、Ctrl-C
押すと、straceが子プロセスから切り離されますトレース終了ただし、プロセスAはトレースログなしで実行されます(異常です)。 Ctrl-C
Process-Bはで始まるとstrace -f
SIGINTを捕捉できず、期待どおりに終了します。- Process-Bは
Ctrl-C
バックグラウンドで抑制されても、それを削除せずにSIGINT()を外部に送信し、kill -s SIGINT PID
SIGTERMはそれを終了します。
追加の詳細:
- テストプログラムを使用して、私の端末がSIGINTをプロセスに送信していることを確認しました(テストプログラムは終了しました)。
- どちらのプロセスも手動で信号をキャプチャしませんでした。
- 同じ動作を観察するには、複数の端末アプリケーションを試してください。
これらのシグナルがどのようにカスケードされているのか、そしてここで何が欠けているのかを明確に理解する必要があります。この種の問題をデバッグする方法は?
アップデート1:
grep 'search_string'
入力を待つためにgrepを実行してくださいSTDIN
。これで閉じられませんCtrl-C
。これが環境固有の問題かどうか疑問になり始めました。
アップデート2:
いくつかの作業の後、以下に示すソースRVMスクリプトが問題を引き起こすことが確認されました。
if [ -f ~/.rvm/scripts/rvm ]; then
source ~/.rvm/scripts/rvm
export PATH="$PATH:$HOME/.rvm/bin"
fi
答え1
Process-AはCtrl-Cで終了しませんが、straceは終了します(異常です)。
strace
これは信号処理ではなくProcess-A処理なので、まったく驚くべきことではありません。生成された信号は、control+cフォアグラウンドプロセスグループ内のすべてのプロセスに送信されます。端末他のモードでは、以下のテストケースには、strace
とが含まれますperl
。strace
終了しますが、信号は無視され、プロセスは終了するまで実行され続けます。
% strace perl -E '$SIG{INT}="IGNORE";while(1){say $$;sleep 1}'
...
% 9520
9520
9520
kill9520
9520
%
grep が STDIN からの入力を待つように grep 'search_string' を実行します。これでCtrl-Cを使用して閉じることができません。
これは、シェルの構成に問題があることを示します。grep
親プロセス(この場合はシェル)から継承されたシグナルハンドラがある可能性があります。私blocksig
このケースを説明するスクリプト:
% grep asdf
^C
% blocksig grep asdf
^C^C^C^C^C^]^\zsh: quit blocksig grep asdf
%
しかし、あなたの場合、これはblocksig
親プロセスではなくシェルです。一般的なファイルを読み取らずに別のシェルに切り替えるか、シェルを起動するとrc
どうなりますか?シェル構成にtrap
設定、カスタム操作、またはジョブ監視構成がありますか?