複数ホストに ssh しながら tail -F するときにはこうしたらどう?
いろいろ方法があるとおもうのですが、以下のようなシェルスクリプトですませるのはどうでしょうか?
#!/bin/bash function kill_children { # jobs -l | perl -ne 'print "kill $1\n" if /^\S+?\s+(\d+)/' | sh; pkill -P $$; wait; } trap "kill_children" EXIT HOSTS="192.168.1.1 192.168.1.2" for host in $HOSTS do ssh $host tail -F /service/foo/log/main/current & done wait
ちょっと箇条書きで解説すると以下のようなことをおこなっています。
- & でバックグラウンドジョブをはしらせる
- wait でそれらの終了を待つ
- trap 〜 EXIT は atexit 的に、プロセスの終了時にコマンドをはしらせることができる
- 終了時に子プロセスをぜんぶ殺す
非常にシンプルで、目的を達しているので、この方法はなかなか便利なのではないでしょうか。
(最初 perl で fork & exec でがんばろうとしてたけどこっちの方が簡単だとおもってやめた)
【20120828 追記】
https://twitter.com/a_rak/status/239164233219178496
pkill -P $$ の方がよさそうなのでさしかえた。