当计划为 cronjob 时,脚本未按预期运行

当计划为 cronjob 时,脚本未按预期运行

我正在尝试编写一个脚本,使用 imagemagicks recognize 命令识别损坏的 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

运行时~扩展为$HOMEcron 用户(即 root)的,因此您应该替换DROP_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

看到这个输出后,我们应该更清楚地看到发生了什么。

相关内容