명령줄에서 실행할 때 작동하는 스크립트가 있지만 이를 사용하여 예약하면 cron
파일이나 명령을 찾을 수 없다는 오류가 발생합니다. 내 질문은 두 가지입니다.
cron 작업을 예약하는 데 사용할 때
crontab -e
권한의 기초로 내 사용자 ID를 사용합니까? 아니면 일종의 cron 사용자 ID와 관련 권한을 사용합니까?크론 작업이 시작될 때 작업 디렉터리는 무엇입니까? 실행할 스크립트를 지정하는 디렉터리입니까, 아니면 다른 디렉터리입니까?
이것은 내 크론 작업입니다.
15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh
실제 스크립트는 다음과 같습니다.
vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp [email protected] < emailmsg.txt
mail
다음은 생성된 메시지를 볼 때 나타나는 오류입니다 cron
.
sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found
찾을 수 없지만 template.txt
스크립트와 동일한 디렉터리에 있습니다. 또한 작동하지 않지만 ssmtp
사용자로서 할 수 있습니다. 이 작업을 수행하기 위해 내가 무엇을 놓치고 있습니까?
답변1
cd /home/xxxx/Documents/Scripts/
이 디렉터리에서 작업을 실행하려면 추가하세요. cron이 특정 디렉토리로 변경될 이유가 없습니다. Cron은 홈 디렉터리에서 명령을 실행합니다.
그것 은 ssmtp
당신 의 기본값 이 아닐 수도 있습니다 PATH
. Cron의 기본 경로는 구현에 따라 다르므로 매뉴얼 페이지를 확인하십시오. 그러나 기본 경로가 아닌 루트에만 ssmtp
있을 가능성이 높습니다./usr/sbin
PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh
답변2
cronjob이 bash 스크립트인 경우 다음은 스크립트 위치에 대한 CD입니다(cron 정의에서 절대 경로를 사용한다고 가정).
cd "$(dirname "$0")";
답변3
질문 1에 대한 답변: crontab -e
자신의 사용자로 실행하는 경우 작업은 해당 사용자의 crontab에 예약되므로 해당 사용자의 권한으로 실행됩니다.
그러나 작업이 비대화형 셸에서 실행된다는 점을 고려해야 합니다. 즉, $PATH는 명령줄에서 스크립트를 실행할 때와 다를 수 있습니다.
특히 at/cron 등을 통해 예약하려는 경우 스크립트에서 항상 전체 경로를 사용하는 것이 가장 좋습니다.
또한 현재 보고 있는 문제를 방지하려면 모든 파일에 대한 전체 경로를 사용하는 것이 좋습니다.
경쟁 조건 및 기타 보안 문제를 방지하려면 mktemp
읽은 파일이 스크립트 외부에 의해 수정되지 않도록 해야 합니다.
그래서 스크립트를 다음과 같이 변경하겠습니다.
vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
mail_msg=`/bin/mktemp`
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp [email protected] < $mailmsg
/bin/rm $mailmsg
답변4
어떤 사람들은 그것에 대해 암시하거나 링크를 걸었지만 내 배포판의 man 문서에서 찾을 수 없기 때문에 알아내는 가장 좋은 방법은 그것을 cron에 추가하는 것입니다.
* * * * * echo "$PWD" > /tmp/lolcronjobs
그런 다음 locronjobs를 제거하여 작업 디렉터리가 무엇인지 확인하세요. $PATH 및 기타 환경 변수를 찾는 경우에도 마찬가지입니다.