負荷試験など行う場合に複数のサーバで同時にスクリプトを実行したいことがある。シェルスクリプトで簡単にできる方法があったのでメモ。
例えば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コマンドも返ってくるので上記のスクリプト全体も正しく終了する。