プロセスが現在書き込んでいるファイルを「移動」する方法(bash、コピー、切り取り)

プロセスが現在書き込んでいるファイルを「移動」する方法(bash、コピー、切り取り)

時々ファイルに書き込むときにデータの損失を防ぐためにBASHでファイルを自動的に回転させる最良の方法は何ですか?

たとえば、このようにしたいのですが、ターゲットファイルが存在しない場合、命令間の時間差によってデータ損失が発生する可能性があると思います。

mv foo.bar foo.bar-$(date "+%Y%m%d_%H%M%S")
touch foo.bar
chown user1:user1 foo.bar
chmod 0600 foo.bar

ファイルに書き込まれたデータが失われたり破損したりしないように、上記のBASHコマンドを改善するための最良の方法は何ですかfoo.bar

ベストアンサー1

書き込みアプリケーションが独自に新しいファイルを生成せず、書き込むファイルが見つからない場合、書き込み中のデータが失われた場合は、そのファイルが一定期間存在しないことを確認する必要があります。考えられる解決策の1つは、ハードリンクを使用してアトミック「a-> bとb - > c」の名前変更をシミュレートすることです。これは次のように実行できます。

ln foo.bar foo.bar-$(date "+%Y%m%d_%H%M%S")
touch foo.bar.new
mv foo.bar.new foo.bar

名前を変更する前にリンク間で発生したすべての書き込みは、バックアップファイルにミラーリングされます。

これは、可能であればシステムコールがmv使用されるために機能しますrename()。このシステムコールを使用して別のファイルを置き換えると、アプリケーションはopen()いつでもその名前でファイルにアクセスできません。これを開こうとするプロセスには、古いinodeまたは新しいinodeが表示されます。以前のinodeを介してアクセスすると(つまり、rename()まだ返されていない)、バックアップファイルが開きます。新しいinodeを介してアクセスすると、新しく作成された空のファイルが開きます。

おすすめ記事