cron이 작업을 실행할 때 ‘작업 디렉토리’는 무엇입니까? 없다는 오류가 발생합니다. 내 질문은 두 가지입니다. 를

명령 줄에서 실행할 때 작동하는 스크립트가 있지만 예약하면 cron파일이나 명령을 찾을 수 없다는 오류가 발생합니다. 내 질문은 두 가지입니다.

  1. 를 사용하여 크론 작업을 예약 할 때 crontab -e내 사용자 ID를 사용 권한의 기준으로 사용합니까? 아니면 어떤 종류의 cron 사용자 ID와 관련 권한을 사용합니까?

  2. 크론 작업이 시작되면 작업 디렉토리는 무엇입니까? 실행할 스크립트를 지정하는 디렉토리입니까, 아니면 다른 디렉토리입니까?

내 cron 작업은 다음과 같습니다.

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 XXXXX@gmail.com < 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사용자로 할 수 있습니다. 이것이 제대로 작동하기 위해 무엇을 놓치고 있습니까?



답변

cd /home/xxxx/Documents/Scripts/해당 디렉토리에서 작업을 실행하려면 추가하십시오 . cron이 특정 디렉토리로 변경 될 이유가 없습니다. Cron은 홈 디렉토리에서 명령을 실행합니다.

에 관해서는 ssmtp, 그것은 기본에하지 않을 수도 있습니다 PATH. Cron의 기본 경로는 구현에 따라 다르므로 맨 페이지를 확인하십시오. 그러나 기본적으로 루트 가 아닌 가능성 ssmtp이 높습니다 ./usr/sbinPATH

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh

답변

cronjob이 bash 스크립트 인 경우 다음은 CD의 스크립트 위치에 CD를 작성합니다 (cron 정의에서 절대 경로를 사용한다고 가정).

cd "$(dirname "$0")";

답변

질문 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 XXXXX@gmail.com < $mailmsg
/bin/rm $mailmsg

답변

cron각 사용자의 예약 된 작업을 해당 사용자로 실행합니다. 이것은 홈 디렉토리와 관련하여 스크립트를 실행하도록하기에 충분해야합니다.

다른 위치에서 실행해야하는 경우 cd스크립트에서 간단히 해당 위치로 이동하십시오.

ssmtp아마도 cron기본 PATH에 있지 않을 것입니다 (대부분의 플랫폼에서 설계 상 매우 좁게 설정되어 있습니다). ssmtp스크립트에서 전체 경로를 지정 하거나 a) 모든 스크립트에서 사용할 수있는 crontab 파일 또는 b) 각 스크립트에서 PATH를 명시 적으로 설정할 수 있습니다.


답변

스레드를 확인 하여 cron의 환경을 쉽게 찾을 수있는 방법을 확인하십시오 . 대화식 쉘에서 사용하는 것보다 훨씬 적습니다. 최선은 아무것도 설정되지 않은 것으로 가정하고 명시 적으로 설정하는 것입니다.


답변

작업 cron을 실행하기 위한 기본 작업 디렉토리 는 일반적으로 홈 디렉토리 /home/your-user-name입니다.

@Kusalananda의 우수한 의견 채택.


답변

어떤 사람들은 그것을 암시하거나 연결했지만 내 배포판의 남자 문서에서 찾을 수 없으므로 알아내는 가장 좋은 방법은 이것을 cron에 추가하는 것입니다.

* * * * * echo $PATH > /tmp/lolcronjobs

필자의 경우 우분투는 기본값을 사용하여 /usr/bin:/bin몇 가지 문제를 일으켰습니다.