シェルスクリプトでバックグラウンドで子プロセスを動かしている場合、何も考えずに書くと元のプロセスを殺しても子プロセスが残ってしまいます。例えばこんな風に書くと:
#!/bin/bash
vmstat 1 > vmstat.log &
iostat 1 > iostat.log &
wait
Ctrl-C で止めても vmstat, iostat が残りっぱなしになります:
% ./stat.bash
^C
% ps
PID TTY TIME CMD
7951 pts/2 00:00:00 zsh
10423 pts/2 00:00:00 vmstat
10424 pts/2 00:00:00 iostat
10446 pts/2 00:00:00 ps
こんな時は EXIT
を trap して jobs -p
した結果を kill すればよいそうです:
#!/bin/bash
trap 'kill $(jobs -p)' EXIT
vmstat 1 > vmstat.log &
iostat 1 > iostat.log &
wait
こうしておけば Ctrl-C で子プロセスも一緒に止まってくれます:
% ./stat.bash
^C
% ps
PID TTY TIME CMD
7951 pts/2 00:00:00 zsh
10763 pts/2 00:00:00 ps
kill -9
した場合は残りますが、それはしかたないですね。
参考: http://stackoverflow.com/questions/360201/kill-background-process-when-shell-script-exit
備忘録として。