ls -l
ファイルの変更時刻が表示されることはわかっていますが、ファイルが閉じられた時刻ではなく、ファイルが開かれた時刻が表示されます( Ctrl+Dなどを使用)
ファイルが閉じられた時間を確認する方法を教えてください
[BASH]$date
Wed May 7 10:33:01 EEST 2014
[BASH]$cat >aa
adf
adsf
#waited 8 mins before closing file (time of closing: 10:41)
[BASH]$ls -l aa
-rw------- 1 orclschd staff 9 May 7 10:33 aa
[BASH]$date
Wed May 7 10:41:47 EEST 2014
[BASH]$stat aa
bash: stat: command not found
[BASH]$uname
AIX
ここで、 という名前のファイルを作成しましたaa
。
ファイルは 10:33 に作成されましたが、ファイルを閉じてファイルの変更日時を確認すると、まだ 10:33 と表示されていました。
しかし、ファイル作成終了日(クローズ時間)は 10:41 です。
AIX にはファイルが閉じられたかどうかを調べるコマンドはありますか? または、ファイルを自動的に追跡する bash スクリプトを作成できますか?
答え1
通常のファイル システムから取得できるファイルに関する情報は、変更 ( ls -l
)、アクセス ( ls -lu
)、およびステータス変更 ( ls -lc
) 時刻のみです。
ファイルは閉じられても変更されないため、ファイルのステータスにはそれが反映されるものはありません。現在のディレクトリstat
情報もこの閉じられたことを反映せず、ファイルからの変更および変更時刻を反映します (ディレクトリ内で何か他のものが変更されるまで)。
ファイルにバッファリングせずに書き込む場合、実際のディスクアクセスが遅くなるため、変更時間は異なる可能性があります。かもしれないただし、ファイルが閉じる瞬間である必要はありません。ただし、コマンドラインからそれを確認する簡単な方法は見つかりません。
stat
ところで、秒単位の精度があるため、これらの実験では使いやすく、目に見える違いを得るのにそれほど長く待つ必要がありません ;-)
答え2
ls -l
ファイルの変更時刻をリストします。これは、ファイルが開かれた時刻でも閉じられた時刻でもなく、ファイルに最後に書き込まれた時刻です。これは通常、ファイルが閉じられた時刻とかなり近いですが、必ずしも同じではありません。
あなたはおそらく間違った質問をするプログラムがファイルへの書き込みを終了したときに反応したい場合 (つまり、プログラムがファイルを閉じたときに何かを実行したい場合)、時間は関係なく、必要なのはファイルが閉じられたという通知です。
Linuxはinotify
これに対してBSDはkqueue
ですが、私の知る限りAIXには同様のものはありません。監査システムですが、これはほとんどのユースケースで機能する可能性のあるアプローチではありません。
プログラム A の書き込みが終了したときにプログラム B が反応するようにする最も簡単な方法は、プログラム A からプログラム B に通知を送信することです。通知は、シグナル、パイプまたはソケット上のバイト、または単に A が B を起動したり、A を実行してから B を実行するスクリプトなど、何でもかまいません。
これが不可能な場合は、少なくとも A がファイルを一時的な名前で書き込み、書き込みが完了したら最終的な名前に移動するようにします。次に、B が非一時ファイルのみを監視するようにします。