0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

一定時間で自動で生成されて勝手に消えてしまうファイルをBashコマンド1行でモニタリングし続ける

Posted at

#一定時間で自動で生成されて勝手に消えてしまうファイルをBashコマンド1行(ワンライナー)でモニタリングし続ける

うまくタイトルつけれないですが、自分のメモ+誰かの役に立てば幸いです。

この記事は下記のケースで役に立ちます。

  • Linux環境で、あるディレクトリに一時ファイルが生成される。
  • その一時ファイルの生成されるタイミング、消えるタイミングが追えない
  • しかし、アプリ側でその一時ファイルを生成している設定を変更できない(したくない)
  • ファイルが再度生成されても連続でずっとファイルの中身を監視したい

御託はいいから、方法だけ教えろという人のために ↓

filename=hoge.txt; while true; do tailf $filename 2>/dev/null; done

本当にそんなコマンド必要?

実際大きいシステムを共通の環境で動かしている場合、勝手に設定をいじれたなかったりします。
そんな時にも、tmpファイルを追いたいケースが存在します。

###具体的なexampleケース
あるバッチシステム内で一時生成されるファイル hoge.txtがあり、このhoge.txtはバッチシステムの終了と同時に消えてしまう。
さて、このhoge.txtの中身を確認したいのだが、バッチシステムの設定をいじれないので、ファイルに対する出力をモニタリングする。

##↑こんなケースを実際に作ってみよう

実行時にファイルを生成し、実行終了時にファイルを削除するシェルスクリプト

まず、ターミナルAで下記のコマンド発行

$ filename=hoge.txt; while true; do tailf $filename; done
tailf: stat failed hoge.txt: そのようなファイルやディレクトリはありません
tailf: stat failed hoge.txt: そのようなファイルやディレクトリはありません
......

おっと、すごい勢いでエラーが出てしまった。
ファイルがない時のエラーは捨てます。(標準エラー出力2への出力を**/dev/null**にリダイレクト)
※当たり前ですが、tailfはファイルの末を出すコマンドであり、ファイルの中身のstdout,stderrは関係なくでるので安心してください。

$ filename=hoge.txt; while true; do tailf $filename 2>/dev/null; done

一方、ターミナルBで下記ファイルを生成

$ cat test.sh
#! /bin/bash

function end  () {
  rm hoge.txt
  exit
}


trap end 1 2 3 15
while true;
do
  echo "hogehoge" >> hoge.txt
  sleep 0.5
done

以下、簡単に解説

  • hogehoge と、1行ずつhoge.txtに出力し続け、Ctrl-Cで終了時にファイルを削除する。
  • Bashのtrapコマンドにより、このシェルスクリプトが1 2 3 15のシグナルを受け付けた際に、
  • end関数を呼び出す。このend関数でファイルを削除している。

参考:linuxのシグナルとtrapコマンドについて
https://shellscript.sunone.me/signal_and_trap.html

####ターミナルBでこのシェルを実行

$ chmod 755 test.sh
$ ./test.sh
※止まった状態

####一方その頃、ターミナルAは。。

hogehoge
hogehoge
...
hogehoge
hogehoge
hogehoge

hogehogeが出続けます。

####ここでターミナルBで

Ctrl-C 押下
$ ls hoge.txt
ls: hoge.txt にアクセスできません: そのようなファイルやディレクトリはありません

シェルスクリプトが強制終了され、hoge.txtが同時に消えました。

####そのころターミナルAは

hogehoge
hogehoge
...
hogehoge
hogehoge
hogehoge
止まっている

###ターミナルBでシェルを再実行すると
####ターミナルAは

hogehoge
hogehoge
...
hogehoge
hogehoge
hogehoge
hogehoge
hogehoge

また動き出した!

##結果
tailfコマンドは、ファイルが消えると終了してしまう。
ファイルがないとエラーになるので、/dev/nullに捨てる。
ただそれだけでしたね。(苦笑)

##コメント(独り言)
記事って難しいね。ニッチな方行こうとすると、うまくどんなケースで使えるのか説明しづらい。。
見にくいし、簡単だと思った方すみませんでした。
Bash芸人目指して力上げていきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?