私はかなり愚かなことが起こっていることに気づきました。現在、複数のコンピュータで複数のプログラムを実行し、同時に出力を追加しています。
たとえば、machine01 は「./calc 1 >> calc_one.txt」を実行し、machine02 は「./calc 2 >> calc_two.txt」を実行するなどです。
この計算は長い間行われており、何か迷惑なことが起こっていることがわかりました。私はgitを使用しており、多くのコンピュータでこのプログラムを実行しています。私はプログラムの新しいモードを作成し、それをmachine03で実行するように呼び出しました。
私はgitを使用しているので、削除されたディレクトリに.txtファイルを保存すると思いました。
機械があるということに気づきました。共有するディレクトリ。だから、"calc_one.txt"と"calc_two.txt"を削除し、出力が追加されました。
今、これらのプログラムは実際に次の場所でのみ出力を印刷します。終わり。プログラムには多数のスレッド(OMP)があり、これらのスレッドはすべてのスレッドが完了した後に印刷される結果(C ++ベクトル)を生成します。
だから流れはまだ来るでしょう。しかし、BASHと「sleep」を使った実験では、.txtファイルを置き換えても、そのファイルが新しいファイルに追加されないことがわかりました。これらのシミュレーションを最初から始めるには、何ができるか必要ですか?
よろしくお願いします、大moni
PS:システムはFedoraです。私には管理権限がありません。
答え1
1. プロセス PID を取得します。たとえば、
pgrep calc
2. 削除されたファイルを参照します。たとえば、
find /proc/12345/fd -ls | grep '(deleted)'
# or (no pid)
lsof | grep calc_one.txt
# ...
lsof -p 12345
3. a) ファイルをコピーします(前の結果でここを参照3
)。スナップ写真:
cp /proc/12345/fd/3 mycopy1.txt
3.b)新しい追加ファイル:
tail -c +0 -f /proc/12345/fd/3 > mycopy2.txt
どこ:
-c +K
、K番目のバイトから始まるバイトを出力します。ファイル全体が欲しいので、+0 と言い
-f
ます。ファイルが大きくなるにつれて追加データを出力します。