バックグラウンドで起動したプロセスの殺し方

プロセス残留事件

負荷試験をしていたので複数台のサーバーの状態を調べるため、バックグラウンドプロセスで複数のsshを実行していました。

monitor(){
  host=$1
  ssh $host "while true;do uptime;sleep 5;done" > $host.log
}

monitor host_a &
monitor host_b &
monitor host_c &
wait

データ取り終わってctrl + cをしたら、sshのプロセスが全部残ってました。てへ。
ps aux | grep sshして拾ったPIDを使ってプロセスを殺しました。メンドクサイ。

解決法

monitor(){
  host=$1
  # このsshを非同期にする
  ssh $host "while true;do uptime;sleep 5;done" > $host.log &
}

# 関数実行を非同期にするとkillでsshが死なないのでこれを非同期にしない
monitor host_a
monitor host_b
monitor host_c

# いつ殺すかを自由に決めたいので標準入力で待機
echo "press any key."
read tmp

# 殺します
kill $(jobs -p)
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.