vyosで「tail -f」する時の注意点

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

毎度vyosを触っている市田です。
今回はvyosのコマンドに関する小ネタです。

いきなりまとめ

  • vyosではtail -fコマンドでログの追記内容が更新されない
  • 原因はvyosのバグ
  • inotifyを無効にすることで想定の動きになる

バグの確認

Githubなどを確認するとバグであることが指摘されていて、tail -fを使っている箇所が修正されているのを確認することができます。
実際に、Github上では下記のように修正されていました。(抜粋)

-tail -f /var/log/messages \
+tail ---disable-inotify -f /var/log/messages \
-run: tail --follow=name /var/log/messages
+run: tail ---disable-inotify --follow=name /var/log/messages

対応方法

上記の通り、---disable-inotifyオプションを利用すれば良いことが分かります。 これは、文字通り、inotifyを無効にするという意味で、実際にtailコマンドのソースを見ると、tailがinotifyを利用していることが分かります。

tailf -fするには、下記のような方法になります。 例として/var/log/messagesを対象とします。

# tail ---disable-inotify -f /var/log/messages

下記も同じです。

# tail ---disable-inotify --follow=name /var/log/messages

もしくはvyosのコマンドとして次のコマンドでも同様の結果になります。(事前にconfigureで編集モードになっておきます。)

# run monitor log

tailコマンドのソースを確認

VyOSのVer1.1.7(Helium)は、Debian SqueezeなのでSqueezeのソースコードで確認してみました。 手順は下記の通りです。

Debianサーバは、EC2でDebianのインスタンスを作成しました。 作成できたら、tailコマンドのパッケージを確認するためにtailコマンドのパスを調べます。

# which tail
/usr/bin/tail

次にtailコマンドのパスに対してパッケージを確認します。 下記のようにcoreutilsパッケージであることが分かります。

# dpkg --search /usr/bin/tail
coreutils: /usr/bin/tail

次のコマンドでcoreutilsパッケージのソースをダウンロードします。

# apt-get source coreutils
# ls -l
-rw-r--r--  1 root  root     48759 Mar 14  2015 coreutils_8.23-4.diff.gz
-rw-r--r--  1 root  root      1942 Mar 14  2015 coreutils_8.23-4.dsc
-rw-r--r--  1 root  root  12582141 Sep  1  2014 coreutils_8.23.orig.tar.gz

ダウンロードできたらtar.gzファイルを解凍します。srcディレクトリがあるので、その中にあるtailコマンドのソースコードを確認します。

# tar zxvf coreutils_8.23.orig.tar.gz
# cd coreutils-8.23/
# cd src/
# less tail.c

これで、tail.cの中を検索すれば、inotifyを利用していることが分かります。

最後に

個人的にはtail -fコマンドをよく利用するのですが、今回をきっかけにless +Fコマンドを常用していくのもいいかもしれないなと感じました。
ちなみにDebian(Squeeze)のtail -fコマンドは正常に動きます。

以上になります。