scpと新しいファイルチェックの間に遅延が発生する可能性がありますか?

scpと新しいファイルチェックの間に遅延が発生する可能性がありますか?

定期的に物をダウンロードするcronjobを作成します。

if ! su scpuser -c "scp ..." > /dev/null 2>&1 || ! [ -f $scptarget ]; then;
  error "did not download stuff"

$scptargetコンテンツがダウンロードされ、実行中のスクリプトとは異なるボリュームにあります(ただし、状態は変わらず、同じハードドライブのようです)。

問題が発生するたびに入って見てみると、ファイルがすぐそこにありました。少しリラックスすると、ファイルが存在することを確認する部分が成功する可能性がありますか?それともSCPが成功してもエラーは発生しますか?

(もともとこの記事を書いた人が実際のエラーが何であるかを文書化できたらいいのですが。

もしそうなら、このスクリプトにランダムな内容を追加したくありませんsleep。実際のbashプログラマが行うより古典的な作業はありますか?

ベストアンサー1

straceファイルでscp一つ作ってみました。scpそのような一時ファイル名を使わずに、wget実際に宛先ファイルがあることを確認して、実際に書き込むデータがO_WRONLY|O_CREATあればscp、宛先ファイルが存在しなければならないようです。

ターゲットファイルの存在とその存在確認の間に「競合」はありません。シェルはscp終了状態を取得し、状態がゼロでないことを確認するために終了時にSIGCHLDを取得する必要があります。私はプロセスが終了したときにカーネルが既存のファイル名を処理すると確信していますscp。ファイルの作成はアトミックに行う必要があります。あえて追加しないでくださいsleep。役に立ちません。

サンプルコードがターゲットファイル存在テスト([ -f $scptarget ])に到達する唯一の方法は、scpゼロ(ゼロ)状態で終了することです。もちろん、ファイルが存在する可能性がありますが、エラー条件があります。$scptargetエラーが発生した場合、ファイルの正確性と完全性を確認しますか?不完全または破損したファイルを取得できます。

何が起こっているのかを知るには、2つのif構成を使用する必要があると思います。 1 つ目は終了状態、scp2 つ目は宛先ファイルの存在です。メッセージが異なることを確認し、プロセス$?の終了ステータスを記録しますscp

おすすめ記事