Bash
調度為 cronjob 時腳本未按預期執行
我正在嘗試編寫一個腳本,該腳本將使用 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
執行時
~
擴展為$HOME
cron 使用者(即 root),因此您應該替換DROP_FOLDER=~/Desktop/Drop
為預期目錄的完整路徑。