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 사용자(예: 루트)를 ~
위한 것이므로 이를 원하는 디렉터리의 전체 경로로 바꿔야 합니다.$HOME
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
이 출력을 본 후에는 무슨 일이 일어나고 있는지 더 명확하게 볼 수 있습니다.