ファイルが見つからないか空の場合にそれを知らせるファイルウォッチャースクリプトがあります。私が探しているファイルは - そのいくつかはサイズが大きいです。ファイルは、別のパス(アクセスできない)の他のスクリプト/操作によってコピーされます。時々受信したファイルが空であるというエラー警告が表示されますが、[コマンドelse
に条件を使用していますif [ -s $file ]
]確認してみるとファイルが空ではありません。私が考えることができる唯一の論理的な説明は、大容量ファイルをコピーするときにUnixが最初に空のファイルを生成できることです。奇妙な偶然の一致で、私のスクリプトは「その」時にファイルをチェックしていますか?私のスクリプトは10分ごとにバックグラウンドで実行されます。
これが起こらないようにする方法はありますか?
答え1
ファイルをコピーする場合は、ファイルを書き込むために開く前とファイルの内容がディスクにフラッシュされるまでに非常に短い時間がかかります。
これらの競合状態を回避するためにファイルをコピーする1つの方法は、ファイルを一時サフィックスを使用してターゲットディレクトリにコピーし、コピーが完了したらその場所で名前を変更することです。
cp "$source" "$target.tmp" &&
mv "$target.tmp" "$target"
これらの一時ファイルを無視するように受信コードが作成されます。