すごく一般的な質問のようで、重複することもありますが、似たような質問が一つもありませんね。
ログファイルのようなものがありますが、それをソートしたいので、次のようなものがあります。
echo "foo" >> file.txt
LC_ALL=C sort -k1,1 -u -o file.txt file.txt
これは非常に小さいファイル(1000行未満)なので、書き込みと並べ替えが非常に高速です。しかし、時々毎秒5つのイベントがあるかもしれませんが、それらのいくつかは失われます。スループットの低いアプリケーションでこれらの問題が発生することに驚きました。
ファイルへの追加は毎回機能する必要があるため、ソートに問題がある可能性があります。私は-o
(stdoutの代わりにファイルに結果を書き込む)同時実行の問題を解決すると思いましたが、そうでない可能性があります。
他のプロセスがファイルに書き込む場合、ファイルをソートする正しい方法はありますか?
ベストアンサー1
最もアクセスしやすい実装(OpenBSD)を見ると、sort
入力ファイルが途中に追加されるとデータが失われるように見えます。
- ユーティリティ
sort
は入力ファイルからデータの読み取りを終了し、実際のソートを開始しました。 - ユーティリティーは、
sort
終了する前に一時出力ファイルの名前を実際の出力ファイルの名前(引数として指定)に変更します。-o
並べ替える前にファイルに書き込むプロセスを一時的に停止し、並べ替えが完了した後に再起動する以外に、これを防ぐ方法はありません。これはそれぞれとkill -STOP
を使用して行うことができますkill -CONT
。
ファイルに書き込むプロセスは、書き換えるためにファイルを開く必要があります。それ以外の場合は(交換されたため)、ディレクトリ構造にないファイルに書き込まれます。 GNUはsort
見えます元のファイルの内容を置き換えるデータがソートされているため問題ありません。