web-dev-qa-db-ja.com

'tail'コマンドが新しい行だけを取得しない

私は次のコマンドを使用しています:

tail -f -n 0 file.txt

しかし、それは繰り返されます。


  1. 私がやっていることは次のとおりです:

  2. 最初のターミナルでファイルを作成します:touch file.txt

  3. 2番目のターミナルでテールを開始します:tail -f -n 0 file.txt

  4. 最初のターミナルでファイルを編集します:nano file.txt

  5. textを追加して、保存して閉じます。 2番目の端末は、textを出力するはずです。

  6. 最初のターミナルでファイルを再度編集します:nano file.txt

  7. 最後に追加(2行目)more text、保存して閉じます。 2番目の端末の出力:

tail:file.txt:切り捨てられたファイル
テキスト
詳細テキスト

最初のターミナルでファイルを再度編集します:nano file.txt

最後に追加(3行目)even more text、保存して閉じます。 2番目の端末はeven more textを出力するはずです。

最初のターミナルでファイルを再度編集します:nano file.txt

最後に追加(4行目)and even more text、保存して閉じます。 2番目の端末の出力:

tail: file.txt: file truncated
text
more text
even more text
and even more text

繰り返さないためにコマンドが必要です。

出力の結果:

tail -f -n 0 file.txt
text
tail: file.txt: file truncated
text
more text
even more text
tail: file.txt: file truncated
text
more text
even more text
and even more text

そして、私はそれを出力する必要があります:

tail -f -n 0 file.txt
text
more text
even more text
and even more text

または、「ファイルの切り捨て」メッセージを削除できない場合は、次のようになります。

tail -f -n 0 file.txt
text
tail: file.txt: file truncated
more text
even more text
tail: file.txt: file truncated
and even more text

また、ファイルが切り捨てられたメッセージを表示する理由もわかりません。ファイルの最後に新しいテキストの挿入を開始します。

4
Edu

まず、テキストエディターを使用しているため、エラーが発生します。これは、ファイルを開いて編集して保存するたびに、元の内容が新しい内容で上書きされることを意味します。末尾に1行を追加するか、場所全体に100行を追加するかは関係ありません。ポイントは、ファイルが開かれ、編集および保存され、コンテンツが上書きされることです。

たとえば、ワークフローとこれを実行することを比較します。

for((i=0;i<20;i++)); do echo $i >> file.txt; sleep 1; done

それは20秒の間、毎秒file.txtに数字を書き込みます。別のターミナルを開いてtail -fn 0 file.txtを実行すると、期待する出力が表示されます。

したがって、目的の動作を得るには、手動で編集する代わりに、ターミナルから>>を使用してテキストをファイルに追加します。


詳細

nanoはここでは奇妙なもののようです。ほとんどのエディターは、ファイルを開いて保存すると、実際には元のファイルを削除し、同じ名前で新しいファイルを保存します。これをテストするには、ファイルの inode番号 を確認します。

$ ls -il file.txt
16647801 -rw-r--r-- 1 terdon terdon 9 Apr  6 18:19 file.txt

ファイルは特定のiノードへの単なるハードリンクです。この場合、file.txtはiノード16647801を指します。ここで、geditでファイルを開き、行を追加して、iノードを再度確認します。

$ gedit file.txt
$ ls -il file.txt
16647854 -rw-r--r-- 1 terdon terdon 13 Apr  6 18:23 file.txt

ご覧のとおり、inode番号が変更されています。つまり、元のファイルが削除され、新しいファイルが作成されました。 nanoはそれを行いません。nanoで同じことを試みても、iノードは変更されません。ただし、元のコンテンツを削除して、新しいコンテンツで上書きします。 tailが実際に出力を表示するのはそのためです。それを試してgedit(またはemacsまたは他の多くのエディター)でファイルを編集すると、追加する余分な行はtailの出力に表示されます。

13
terdon

すでに他の回答のいずれかで述べたように、ファイルを保存するたびにファイルが上書きされるため、これが起こっています。 tailコマンドは、ファイルに新しい行が追加されるログファイルを監視するために設計されました。

この特定の状況では、次を回避策として使用します。

watch -n 1 cat file.txt

Watchコマンドは、定期的にコマンドを実行します。更新間隔(秒単位)は-nで指定され、お好みに合わせて調整できます。

7
nullmem