Linux ユーザーには、信号の発信元を特定する非常に簡単な方法があります。たとえば、次はどのタスクが SIGKILL を他のタスクに送信しているかを調べるものです。
cd /sys/kernel/debug/tracing
echo 'sig==9' > events/signal/signal_generate/filter
echo 1 > events/signal/signal_generate/enable
: > trace
echo 1 > tracing_on
tail -f trace
「pkill -9 sleep」を使用したときの 1 つのインスタンス。
# cat trace
[...]
pkill-2982 [001] d... 750347.835838: signal_generate: sig=9 errno=0 code=0 comm=sleep pid=2981 grp=1 res=0
上記の 'sig==9' フィルターがない場合、'trace' はタスク間で送信されたすべてのシグナルを表示します。
プロセスの外からではありません。シグナル ハンドラの 2 番目の引数は siginfo_t
です メンバーの 1 つとして送信プロセスの PID を含む構造体。 sigaction(2)
を参照 詳細はこちら
Ptrace
送信者の検出にも使用できます。 ptrace(GETSIGINFO)
があります これにより、デバッガーは siginto_t
を読み取る (場合によっては変更する) ことができます。