複数のサーバ上で同時にスクリプト実行

負荷試験など行う場合に複数のサーバで同時にスクリプトを実行したいことがある。シェルスクリプトで簡単にできる方法があったのでメモ。

例えば192.168.1.1 ~ 192.168.1.3の3台で一斉にtestStart.shというスクリプトを走らせたいときは以下のようなスクリプトでできる。

#/bin/bash

ssh user@192.168.1.1 "./testStart.sh" &
ssh user@192.168.1.2 "./testStart.sh" &
ssh user@192.168.1.3 "./testStart.sh" &
wait

各サーバ上の/home/userにtestStart.shが置いてあるという前提。実行前にscpで配布することもできる。waitすることでその前に実行されたプロセスがすべて終了するのを待つことができる。

ではtestStart.shがユーザによって実行停止されるまで動くスクリプトの場合はどうするか。上記のままだと一生終わらない。^Cで止めたとしても各サーバ上で動くスクリプトは停止できないため、それぞれのサーバに入ってkillしなくてはいけなくなる。

この場合、時間で止めることにすればよい。timeoutという便利なコマンドがある。
Linux - 一定時間でシェルコマンドを終了させるたった1つの方法 - Qiita

よってさっきのスクリプトを以下のように変更。

#/bin/bash

ssh user@192.168.1.1 "timeout 10 ./testStart.sh" &
ssh user@192.168.1.2 "timeout 10 ./testStart.sh" &
ssh user@192.168.1.3 "timeout 10 ./testStart.sh" &
wait

これで10秒の実行後testStart.shは終了し、sshコマンドも返ってくるので上記のスクリプト全体も正しく終了する。