uokadaの見逃し三振は嫌いです

ここで述べられていることは私の個人的な意見に基づくものであり、私が所属する組織には一切の関係はありません。

Fabricでtail -F出来なくてハマった時の対処法

最近、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として知っておくと便利です。