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 사용자(예: 루트)를 ~위한 것이므로 이를 원하는 디렉터리의 전체 경로로 바꿔야 합니다.$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

이 출력을 본 후에는 무슨 일이 일어나고 있는지 더 명확하게 볼 수 있습니다.

관련 정보