Bash

調度為 cronjob 時腳本未按預期執行

  • December 18, 2015

我正在嘗試編寫一個腳本,該腳本將使用 imagemagicks identify 命令辨識損壞的 jpg 圖像。該腳本將執行該命令,對“Corrupt”一詞的輸出進行 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

我建議通過以下方式替換您的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:一個數組變數(參見下面的數組),包含最近執行的前台管道(可能只包含一個命令)中程序的退出狀態值列表。

當您將腳本添加為 cron 作業時,執行腳本的 cron 使用者與您可能一直在測試腳本的普通使用者帳戶不同。

那麼當這個命令

DROP_FOLDER=~/Desktop/Drop

執行時~擴展為$HOMEcron 使用者(即 root),因此您應該替換DROP_FOLDER=~/Desktop/Drop為預期目錄的完整路徑。

引用自:https://unix.stackexchange.com/questions/250114