大きなファイルに対するロックフォルダーの問題を伴うBashスクリプト


2

私のスクリプトは次のとおりです。

#!/bin/bash

    # Path to a lock folder
LOCK_PATH="/Volumes/PROOFS_WATCH/copy.lock"

trap 'rmdir "$LOCK_PATH"; exit' 1 6 15

if mkdir "$LOCK_PATH"; then
    echo "Lock file did not exist and was created, Copying..."

        # Perform commands
    cp /Volumes/PROOFS_WATCH/*.mov /Volumes/PROOFS_WATCH/AME_Processing/
    cp /Volumes/PROOFS_WATCH/*.mov /Volumes/PROOFS_TV
    rm /Volumes/PROOFS_WATCH/*.mov 

        # Remove the lock
    rm -f "$LOCK_PATH"
fi

私の出力は:

Lock file did not exist and was created, Copying...
cp: /Volumes/PROOFS_WATCH/*.mov: No such file or directory
cp: /Volumes/PROOFS_WATCH/*.mov: No such file or directory
rm: /Volumes/PROOFS_WATCH/*.mov: No such file or directory
rm: /Volumes/PROOFS_WATCH/copy.lock: is a directory
logout
[Process completed]

rm -f 何らかの理由でロックフォルダを削除しません...

このスクリプトを60秒ごとにCron経由で自動的に実行したいと思います。大きなファイルが書き込まれている場合、ファイルの書き込みが完了するまで実行したくありません。

bashでできることをもっと理解しているので、さらに多くのプロセスを自動化したいと思っています。


1
ディレクトリrm -rまたはrmdirを削除します
マーク

回答:


1

ロック解除の修正

を使用rmdirしてロックフォルダーを削除してみてください。

rmdir "$LOCK_PATH"

デバッグパス

cpパスをデバッグするには、Terminal.appで次のコマンドを試してください。

open /Volumes/PROOFS_WATCH/

予想されるフォルダーは開きますか?openFinderで目的のフォルダーが表示されるまで、パスをいじってみてください。

ロックフォルダーをデバッグするには、2つのTerminal.appウィンドウでスクリプトを実行してみてください。彼らは両方試してコピーしますか?elseステートメントを追加しmkdirて、目的どおりに機能しているかどうかを確認してください。


else
    echo "Lock exists."
fi

シェルスクリプトのデバッグ

問題の特定に役立つシェルスクリプトエラーチェックを追加する方法をご覧ください

ハードリンク

以下のコメントには、新しい制約が記載されています。このスクリプトの実行中に、他のアプリケーションがファイルを書き込む場合があります。このスクリプトは、影響を受けるフォルダーへの変更または書き込みを行う他のアプリケーションをブロックできません。

ファイルが書き込まれている場合、cp部分ファイルのみが表示およびコピーされます。次回スクリプトを実行するときに、ファイルは完全に利用可能になり、正しくコピーされます。これは許容される場合と許容されない場合があります。

コピーが同じ物理ボリュームで発生する場合、コピーは回避される可能性があります。コピーの代わりに、ツールでハードリンクを作成することを検討してくださいln

ln <source_file> <target_file>
ln [-Ffhinsv] <source_file> ... <target_dir>

リンクはデータをコピーせず、ほとんど瞬時です。元のファイルまたは新しくリンクされたファイルのいずれかを変更すると、両方に反映されます。

スクリプトを変更する前に、手動でハードリンクを作成してみてください。

ln /Volumes/PROOFS_WATCH/movie.mov /Volumes/PROOFS_WATCH/AME_Processing/movie.mov

わかりました。パスが良好で、rmdirが動作し、すべてが正常に動作しています...しかし、大きなファイルでテストしても、スクリプトがファイルをコピーするのを止めることはありません...ファイルの前にコピーします書き込みが完了しました。
ブライアン

else提案とエラーチェックを追加する方法で回答を更新しました。お役に立てれば!
グラハムミル

ちょっとグラハム!だから私は経験を重ね、エラーはすべてをチェックし、今では完璧に機能しています!あなたはとても親切でした!ただし、このスクリプトは、スクリプトの実行に対する保護を提供し、長いコピーを待ってから、スクリプトが再度実行されることを認識しています。どっちがいい?そして、それは素晴らしい機能ですが、大きなファイルが別のアプリケーションによってまだ書き込まれているときにスクリプトが実行されると、スクリプトが実行され、ロックフォルダーが作成され、ファイルがコピーされて破損するため、問題が存在することに気付きました。私はまだLSOFなどを使用する必要があると思います。
ブライアン

これを回答済みとしてマークし、別の質問をします。再度、感謝します!あなたの努力と知識に本当に感謝しています。
ブライアン

ファイルが同じ物理ボリューム上にある場合は、コピーをハードリンクの作成に置き換えてみてください。これは、部分的に書き込まれたファイルを克服するのに役立ちます-ファイルがアプリケーションによって所定の場所に書き込まれていると仮定します。
グラハムミル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.