ファイルに反映された内容が更新されたことをどのように確認できますか? [閉鎖]

ファイルに反映された内容が更新されたことをどのように確認できますか? [閉鎖]

同じシステムで実行されている2人の協力者XとYがいます。 Xは時々Yを使用していくつかの情報を計算します。プログラム間のファイルベースの通信を使用しています。 XがYに何かを計算したい場合、プロセスは次のようになります。

  1. Xはジョブの説明をjob.txtファイルに書き込み、それを共有ディレクトリに保存します。その後、Xは同じディレクトリにReady.txtファイルがあるかどうかをポーリングし始めます。
  2. Y job.txt ファイルが存在するかポーリングします。ファイルが表示されると、Yはまずファイルからジョブ情報を読み取り、削除します。その後、Yはジョブを実行し、結果をresult.txtに保存します。最後に、YはReady.txtファイルを生成し、job.txtの存在に対して再びポーリングを開始します。
  3. XがReady.txtの存在に気付いたら、result.txtを読み、Ready.txtとresult.txtを削除してから、別の操作を続けます。

問題は、Xが時々空であるか部分的な結果ファイルのみを受け取ることです。 Y は bash スクリプトを使用し、現在次の操作を実行します。

rm -f tmp_result.txt
for ((i=first; i <= last; i++)) # Each iteration produces 1 or more result lines
do
  # Compute something...
  echo "One result line with e.g. $values" >> tmp_result.txt
done
cp tmp_result.txt result.txt
touch ready.txt

つまり、エコーとI / Oリダイレクトを使用して、結果ファイルの内容を一度に1行ずつ一時ファイルに印刷します。コンテンツが準備されたら(または準備する必要があります!)、最終的なresult.txtファイルにコピーされ、read.txtを生成してXに通知します。

かなり広範な実験とインターネット検索の後でも、Xが常に完全な結果を得るようにする方法はありません。 100番の1〜5番は、Xでresult.txtを完全に空にするか(最も一般的な場合)、部分的な結果のみを含むものとして扱います。

スクリプトロジックのいくつかの説明:元の結果行をresult.txtに直接反映しましたが、これは非常に信頼できません(結果2つのうち1つは不完全です)。次に、最初にその行をtmp_result.txtにエコーし、次にtmp_result.txtをresult.txtに移動(名前変更)します。これにより、結果10個のうち約1個が不完全になります。上記のように、ファイルのコピーは最適ですが、時には失敗します。

それでは、Xがファイルの読み取りを開始する前に、すべてのエコーされた行がresult.txtに正しくコピーされたことを確認できますか? Y一部のコアbashツールのみが利用可能です。

編集する:2追加のコメント3件

  1. 問題は、生の結果にあるのではなく、Xに送信される方法にあることを確認しました(例:tmp_result.txtを削除していないことを確認してください)。
  2. tmp_result.txtとresult.txtはどちらもtmpfsベースのRAMディスクにあるので、ファイルを非常にすばやくコピー/移動したいと思います。
  3. tmpfs(元のすべてのファイルは通常のハードドライブパーティションにあります)の使用を開始した後に初めてこの問題が発生しました。

ベストアンサー1

これを達成するためにFIFOを使用できるようです。

mkfifo tasks

生産者:

for i in {1..10}; do echo "task$i"; done > tasks

消費者:

while read task; do echo "received $task"; done  <tasks

これにより、同期や削除を心配する必要がなくなり、ポーリングにCPU時間を無駄にしません。データがない場合、またはプロデューサがFIFOを開いていない場合、消費者はブロックされます(したがってCPU時間を節約します)。 。 FIFOがいっぱいになった場合、または消費者がFIFOを開いていない場合、生産者はブロックされます。

おすすめ記事