最近、Fabricが流行ってるのでそのうち誰かがハマりそうなことを上げておく。
Fabriでは下のコマンドがうまく実行出来ない。
tail -F
例として下のようなスクリプトを作ってみる。
#!/usr/bin/env python2.7 # -*- coding: utf-8 -*- from fabric.api import run, local, env def my_cmd(): run("date && hostname") def rtailf(): try: run("tail -F /tmp/hoge.log") except KeyboardInterrupt, e: pass run("sleep 10")
% fab -H localhost rtailf my_cmd [localhost] Executing task 'rtailf' [localhost] run: tail -F /tmp/hoge.log [localhost] Passphrase for private key: [localhost] out: 2013年 5月 8日 水曜日 22:33:32 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:33 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:34 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:35 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:36 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:37 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:43 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:44 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:45 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:46 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:47 JST [localhost] run: sleep 10 [localhost] out: 2013年 5月 8日 水曜日 22:33:48 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:49 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:50 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:51 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:52 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:53 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:54 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:55 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:56 JST [localhost] out: 2013年 5月 8日 水曜日 22:33:57 JST [localhost] Executing task 'my_cmd' [localhost] run: date && hostname [localhost] out: Wed May 8 22:33:58 JST 2013 [localhost] out: hogehoge.sakura.ne.jp Done. Disconnecting from localhost... done.
Ctrl-Cでtail -f を中断したにもかかわらずログが出続けている。 これはうっとおしい。
よく使うコマンドなのでこれがないと結構辛い。 代わりの方法としては下のようなやりかたが考えられる。
def tailf(filename): """ tail -F する関数 """ cmd = "ssh {0} 'tail -F {1}'".format(env.host, filename) try: local(cmd) except KeyboardInterrupt, e: # Ctrl-Cは無視する pass return
tailf関数はFabfile.pyがあるサーバーからsshで接続してtail -Fを実行する関数。
この関数を実行すると下のような実行結果になる。
% fab -H localhost tailf:/tmp/hoge.log my_cmd [localhost] Executing task 'tailf' [localhost] local: ssh localhost 'tail -F /tmp/hoge.log' 2013年 5月 8日 水曜日 22:38:18 JST 2013年 5月 8日 水曜日 22:38:19 JST 2013年 5月 8日 水曜日 22:38:20 JST 2013年 5月 8日 水曜日 22:38:21 JST 2013年 5月 8日 水曜日 22:38:22 JST 2013年 5月 8日 水曜日 22:38:23 JST 2013年 5月 8日 水曜日 22:38:24 JST 2013年 5月 8日 水曜日 22:38:25 JST 2013年 5月 8日 水曜日 22:38:26 JST 2013年 5月 8日 水曜日 22:38:27 JST 2013年 5月 8日 水曜日 22:38:28 JST 2013年 5月 8日 水曜日 22:38:29 JST 2013年 5月 8日 水曜日 22:38:30 JST ^CKilled by signal 2. [localhost] Executing task 'my_cmd' [localhost] run: date && hostname [localhost] Passphrase for private key: [localhost] out: Wed May 8 22:38:34 JST 2013 [localhost] out: hogehoge.sakura.ne.jp Done. Disconnecting from localhost... done.
これだとうまくCtrl-Cされてtail -Fの出力が残り続けない。 Fabricを使う時のTipsとして知っておくと便利です。