はじめに
プロセスがシグナルを無視しているのかシグナルハンドラを設定してるのかデフォルトなのかを知りたくなったのでツールを作ってみました。探せば「How can I check what signals a process is listening to?」とかいくつかあるのですが、個人的に POSIX シェル準拠にしたかったのとプロセスグループへの対応やシンプルな出力が欲しかったので。
ソースコード: https://github.com/ko1nksm/psig
使い方
シグナルの情報は /proc/<PID>/status
から取得しているので procfs に対応しているシステム(Linux等)でのみ動作します。ただし WSL1 では情報が取れませんでした。おまけでケーパビリティにも対応しています。
Usage: psig [options]... [<pid> | 0 | -]...
0: current proccess id
-: parent proccess id
no arguments: same as 'psig -'
Options:
-g, --pgroup Specify as a process group id
-c, --capability Include capability
-h, --help Display help
引数で指定した PID (複数可)を以下のように出力します。PID として 0
を指定した場合は psig コマンド自身、-
を指定するか引数を省略した場合は親プロセスの情報を出力します。
$ psig 0
Name:psig State:R (running) PPID:17481 PID:20693 PGID:20693 SigQ:0/99217
Command: /bin/sh /home/koichi/bin/psig 0
SigIgn: 34:RTMIN
SigCgt: 2:INT 17:CHLD
出力例
出力例として各シェルのデフォルトのシグナルマスクの状態です。
all.sh
# !/bin/sh
for sh in sh bash mksh ksh posh yash zsh "busybox ash"; do
echo "==== $sh ===="
$sh "$@"
done
signal.sh
# !/bin/sh
psig
出力
$ ./all.sh signal.sh
==== sh ====
Name:sh State:S (sleeping) PPID:20618 PID:20619 PGID:20618 SigQ:0/99217
Command: sh signal.sh
SigIgn: 34:RTMIN
SigCgt: 2:INT 17:CHLD
==== bash ====
Name:bash State:S (sleeping) PPID:20618 PID:20625 PGID:20618 SigQ:0/99217
Command: bash signal.sh
SigBlk: 17:CHLD
SigIgn: 3:QUIT 34:RTMIN
SigCgt: 2:INT 17:CHLD
==== mksh ====
Name:mksh State:S (sleeping) PPID:20618 PID:20633 PGID:20618 SigQ:0/99217
Command: mksh signal.sh
SigIgn: 34:RTMIN
SigCgt: 1:HUP 2:INT 3:QUIT 14:ALRM 15:TERM 17:CHLD 28:WINCH
==== ksh ====
Name:ksh State:S (sleeping) PPID:20618 PID:20644 PGID:20618 SigQ:0/99217
Command: ksh signal.sh
SigIgn: 34:RTMIN
SigCgt: 1:HUP 2:INT 3:QUIT 14:ALRM 15:TERM 17:CHLD 28:WINCH
==== posh ====
Name:posh State:S (sleeping) PPID:20618 PID:20655 PGID:20618 SigQ:0/99217
Command: posh signal.sh
SigIgn: 34:RTMIN
SigCgt: 1:HUP 2:INT 3:QUIT 15:TERM
==== yash ====
Name:yash State:S (sleeping) PPID:20618 PID:20663 PGID:20618 SigQ:0/99217
Command: yash signal.sh
SigIgn: 34:RTMIN
SigCgt: 17:CHLD
==== zsh ====
Name:zsh State:S (sleeping) PPID:20618 PID:20673 PGID:20618 SigQ:0/99217
Command: zsh signal.sh
SigBlk: 2:INT
SigIgn: 3:QUIT 34:RTMIN
SigCgt: 1:HUP 17:CHLD 28:WINCH
==== busybox ash ====
Name:busybox State:S (sleeping) PPID:20618 PID:20682 PGID:20618 SigQ:0/99217
Command: busybox ash signal.sh
SigIgn: 3:QUIT 34:RTMIN
SigCgt: 2:INT 17:CHLD