0

${File} と ${File}.new の間でファイル交換をしようとしている作品を書き込もうとしています。

元のコードはこのようなものでした -

generate ${File}.new
mv ${File} ${File}.backup
mv ${File}.new ${File}

最初の mv が終了したのとまったく同じ瞬間に失敗したが、2 番目の mv が終了していない場合、${File} に対する要求が存在する可能性があります。ファイルがその名前で利用できないため、その要求は拒否されます。めったに起こらないが、それでも起こる(昨日は6週間ぶりに起こった)

それを避けるために、私はに置き換えることを考えたmvのでcp、私はこのようなものを構築しようとしています -

generate ${File}.new
cp ${File} ${File}.backup
cp ${File}.new ${File}

rm ${File}.new

さて、私の課題は、${File} に書き込んでいる瞬間に、その瞬間にそれを読み取っているプロセスがある場合、オブジェクトのロックを取得できなかったとして、コピーが失敗する可能性があることです。

私の失敗への恐れは本当ですか?

失敗するのではなく、数秒/分待ってから再試行するようにプログラムに指示したいと思います。

Korn シェルを使用して AIX 6.1 を使用しています。

4

3 に答える 3

1

これを機能させることができるかどうかを確認してください。「file」を他の2つのファイルfile1とfile2へのシンボリックリンクにします。このリンクを作成するには、コマンド「ln-fsfile1file」を使用します。誰かが「file」を開くと、OSは「file1」にリダイレクトします。バックアップを作成する場合は、コマンド「ln -fs file2 file」を実行すると、fileがfile2を指すようになります。その後、file1でやりたいことは何でもできます。プロセスを逆にして、file1に戻ります。

于 2012-09-28T16:54:19.847 に答える
1

ハードリンクを使用してバックアップ部分を実行できます。

generate ${File}.new
ln -f ${File} ${File}.backup
mv ${File}.new ${File}

の後ln、古いファイルには 2 つのファイル名があります。の後mv、ファイル名のみが.backup古いファイル${File}を参照し、新しいファイルを参照します。

于 2012-09-28T18:49:12.233 に答える
0

あなたのシステムについては知りませんが、私のシステムではcp -f、ファイルをすぐに上書きできない場合は削除すると言っています。(ファイルを自動的にバックアップするオプションもありますが、システムのマニュアルを確認してください。)

于 2012-09-26T10:54:11.750 に答える