cronjobでスケジュールすると、スクリプトは期待どおりに実行されません。

cronjobでスケジュールすると、スクリプトは期待どおりに実行されません。

imagemagicks recognitionコマンドを使用して、破損したjpg画像を認識するスクリプトを作成しようとしています。スクリプトは出力で「破損した」という単語に対してgrepコマンドを実行し、ファイルが破損している場合は破損したフォルダに移動するか、ファイルが正常に表示されると入力フォルダに移動します。

端末ウィンドウでスクリプトを手動で実行すると、期待どおりに機能します。理想的には、このスクリプトをcronジョブとして実行したいのですが、cronjobで予約するとすべてが入力フォルダに移動するため、IF文が正しく評価されないようです。 cronjobとして機能するには、スクリプトで他のタスクを実行する必要がありますか?

#!/bin/bash
LANG=en_US.UTF-8

#variables for our folders
DROP_FOLDER=~/Desktop/Drop
CORRUPT_FOLDER=corrupt_images/
INPUT_FOLDER=Input/

cd $DROP_FOLDER
for f in *.jpg
do
    if /opt/ImageMagick/bin/identify -verbose $f | /usr/bin/grep -iq "Corrupt"; then
        mv "$f" $CORRUPT_FOLDER
    else
        mv "$f" $INPUT_FOLDER
    fi
done

crontabでスケジュールを予約しています

*/2 * * * * cd ~ && ./myscript.sh

答え1

cronジョブとしてスクリプトを追加する場合、スクリプトを実行しているcronユーザーは、スクリプトのテストに使用できる一般ユーザーアカウントとは異なります。
その後、このコマンドが実行されたとき

DROP_FOLDER=~/Desktop/Drop

ランタイム拡張はcronユーザー(rootなど)の~ためであるため、それを目的のディレクトリのフルパスに置き換える必要があります。$HOMEDROP_FOLDER=~/Desktop/Drop

答え2

ブロックを次に交換することをお勧めしますif

/opt/ImageMagick/bin/identify -verbose "$f" | /usr/bin/grep -iq "Corrupt"
if [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 1 ]]; then
  mv "$f" "$INPUT_FOLDER"
else
  mv "$f" "$CORRUPT_FOLDER"
fi

から man bash

PIPESTATUS:最後に実行されたフォアグラウンドパイプライン(単一のコマンドのみを含めることができます)のプロセスの終了ステータス値のリストを含む配列変数(以下の配列を参照)。

答え3

その条件のコマンドが期待どおりに動作しないようです。この問題をデバッグするには、Identityコマンドの出力とエラー出力をファイルにリダイレクトし、記録された内容を確認します。たとえば、次のようになります。

/opt/ImageMagick/bin/identify -verbose $f &> /tmp/debug.log

この出力を見た後は、何が起こっているのかをより明確に見ることができます。

関連情報