web-dev-qa-db-ja.com

ファイルの変更を監視するシェルコマンド

ファイルを監視し、ファイルに書き込まれている変更を確認するために使用できるコマンドがUnixにあったことは知っています。これは、特にログファイルをチェックする場合に非常に役立ちました。

それが何と呼ばれるか知っていますか?

167
Sebastian Hoitz

もしかして

tail -f logfile.log

尾のマニュアルページ

220
Jon Skeet

ジョン・スキートの答えに従って、おそらく尾を意味しました。

別の便利なものは watch ;です。コマンドを定期的に実行して、出力を全画面で表示できます。例えば:

 watch -n 10 -d ls -l /var/adm/messages

コマンドls -l /var/adm/messagesを10秒ごとに実行し、後続の実行間の出力の違いを強調表示します。 (たとえば、ログファイルがどれだけ速く成長するかを監視するのに役立ちます)。

128
Murali Suriar

inotifywait from inotify-tools は、ファイル(またはディレクトリ内のファイル)が変更されるたびにコマンドを実行する場合に便利です。例えば:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done
42
richvdh

less +FGを使用する1 tail -f以上。ログファイルで特定のエラーまたはIDを検索する必要があるためです。何かを検索する必要がある場合は、^Cと入力してファイルの追跡を停止し、?と入力して後方検索を開始します。

キー割り当てはviとほとんど同じです。 +オプションを使用すると、起動時にすべてのコマンドを初期化できます。

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

本当に長いログの場合、行番号付けをオフにする-nオプションを使用すると便利です。マンページから:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose Prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1.コメントでこれを指摘するための rgmarcha へのハットチップ。

37
Jon Ericson

Tail is great ... lessを使用することもできます。ファイルの開始を少なくします。つまり、myfileを減らしてから押します。 Shift+F。これは尾としての機能が少ない。

21
trent

私はLaTeXファイルを編集していて、途中のどこかで変更がないか監視したいと思っていました。私は次の小さなシェルスクリプトを作成しました。他の方にも重宝すると思います。

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

watch.shとして保存し、chmod u+x watch.shを実行します。次に、次のように実行します。

./watch.sh file.tex pdflatex

実際の変更が行われた場合にのみコマンドを実行する場合は、`md5sum "$FILE"`の代わりに`ls -l "$FILE"`を使用できます。

16
oliphaunt

tailf コマンドを使用できます。

tailf logfile.log
8
reegan vijay

カーネルのinotifyサブシステムにフックするinotifywatch/inotifywaitを使用することもできます。このようにして、「オープン」、「クローズ」、「アクセス」などを監視することもできます。

しかし、単にstdoutに追加された行を取得したい場合は、テールについて同意します。

6
Martin

Tailは、Unixのどこでも利用できる標準的な伝統的なツールです。もう少し洗練されたツールは multitail で、複数のファイルを同時に監視でき、構文の強調表示を行います。

3
hlovdal

ファイルの末尾だけでなく、ファイル内を検索できるようにするには、「F」コマンドでlessを使用します。

Tailを使用するときは、ファイルがロールオーバーされたり編集によって置き換えられたりする場合(vimの:wのデフォルトモード)、追加の引数が必要になることに注意してください。

tail -fを指定すると、tailはファイル記述子を格納して追跡します。ファイルが置き換えられると、記述子が変更されます。ファイル記述子に従うことの利点は、ファイルの名前が変更された場合でも、それに従っていることです。

tail --follow =は、名前が付けられたファイルを定期的に再度開いて、置き換えられているかどうかを確認することにより、末尾を追跡します。

--retryは、ログファイルをテールしたいがファイルがまだ作成されていない場合に役立つもう1つのオプションです。

tail -Fは--follow = --retryのショートカットです。

3
deinspanjer

Tailfを忘れて、diffは必要なコマンドです。 2つのファイル間または書き込まれている1つのファイル間でリアルタイム(または近い時間)に発生する違いを観察するための良いトリックを次に示します。

これらのメソッドを使用して、変更をファイルに書き込んで記録を保持するなど、動作を自由に変更できます。ウォッチの間隔や以下のコマンドのその他のオプションを試してみてください。

1つのファイルがあり、変更が加えられたときに監視したい場合:

だから何をすべきかここにあります:

  1. ファイルをコピーする

    cp file file2
    
  2. 違いを見つけるためのbashスクリプトを記述し、file2を更新する

    touch check-differences.sh
    nano check-differences.sh
    chmod 755 check-differences.sh
    
  3. これがスクリプトの基本的な考え方です。必要に応じてファイルに書き込むようにします

    #!/bin/bash
    diff file file2
    cp file file2
    
  4. 次に、時計を使用して画面上の違いを見ることができます

    watch ./check-differences
    

これはデフォルトで2秒ごとに更新されます。したがって、戻ってそれらを読み取る必要がある場合は、スクリプトのファイルにdiffの出力を書き込みます。

または、出力を表示する必要がない場合は、cronを使用してスクリプトを定期的に実行します。

2
Mezmer

tail -f somefile.txtは新しいデータでスクロールし続けます、I ときどき好むless +G somefile.txt同様に、ファイル内の最新データのパッチを確認します。

1
phantomastray