Pro uživatele Linuxu existuje velmi snadný způsob, jak identifikovat zdroj signálu. Následuje například zjištění, která úloha posílá SIGKILL ostatním.
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
Jeden případ, kdy jsem použil 'pkill -9 sleep'.
# cat trace
[...]
pkill-2982 [001] d... 750347.835838: signal_generate: sig=9 errno=0 code=0 comm=sleep pid=2981 grp=1 res=0
Bez výše uvedeného filtru 'sig==9' zobrazí 'trace' všechny signály odeslané mezi úkoly.
Ne zvenčí procesu. Druhý argument pro obsluhu signálu je siginfo_t
struktura, která obsahuje PID odesílajícího procesu jako jednoho z jeho členů. Viz sigaction(2)
pro více podrobností.
Ptrace
lze také použít k detekci odesílatele. Existuje ptrace(GETSIGINFO)
volání, které dá debuggeru možnost přečíst (a případně změnit) siginto_t
struktura.