マルチスレッド方式でTCPソケットを処理するプログラム(C ++)があります。マルチスレッドは約100スレッド(POSIXスレッド)で非常に集約的です。
時には、プログラムがいつ終了するかわからない場合がありますSIGTERM
。インターネット検索後にシステムが正しく送信されないことがわかりましたSIGTERM
。私はこの信号を無視すると何が起こるのかを知ることにしました。今システムがSIGKILL
。私はそれを使用しようとすると仮定し、SIGTERM
アプリが終了しない場合、システムはアプリを終了します。
gdbで実行してみましたが、何の信号も受け取れませんでした。
Valgrindで実行しましたが、信号はありません。 valgrind エラーもありません。メモリ消費は正常でメモリリークはないようです。終了すると、7Mbのヒープが使用されます。
疑わしいことはありません/var/log/messages, /var/log/syslogd
。
システムは Debian 2.6.32-5 です。
基本的に質問は、システムがそれを任意のプロセスにSIGTERM
送信できるのはなぜですか?SIGKILL
その時点でどのように止まり、何が起こるのかを見ることができますか? (gdbは動作を変更します。)
答え1
「システム」は非常にあいまいな用語です。カーネルについて話すと、カーネルは決してSIGTERMを送信しません。 OOM Killerが呼び出されると、SIGKILLを送信します。
スクリプトにバグがあるか、コマンドがプロセスと一致しない可能性がpkill
あります。killall
startコマンドを使用すると、gdb
プロセス名と引数が異なり、pkill
/とは異なるように見えますkillall
。
答え2
systemtapスクリプトをインポートしてシグナル伝達を監視します。最も簡単なアプローチで十分です。たとえば、次のようになります。https://sourceware.org/systemtap/examples/lwtools/killsnoop-nd.stp
たとえば、キラーのプロセスツリー全体を印刷するように拡張できます。
より良いスクリプトは、システムコールを監視せずに、信号が実際に転送される場所を監視します。そのようなスクリプトを書くことは、読者の練習問題として残されます。