cron이 작업을 실행할 때 '작업 디렉토리'는 무엇입니까?


170

명령 줄에서 실행할 때 작동하는 스크립트가 있지만 예약하면 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사용자로 할 수 있습니다. 이것이 제대로 작동하기 위해 무엇을 놓치고 있습니까?

답변:


158

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

@Giles-고맙습니다. cron소유하고 PATH있거나 사용자를 확인할 수 PATH있습니까? 나는 ssmtp를 자신의 소유로 설정 user하고 wheel누구나 cron을 포함하여 그것을 사용할 수 있다고 생각합니다. CENTOS 6.2에 도움이된다면
ProfessionalAmateur

3
@ProfessionalAmateur 문제는 사용할 수 없다는 ssmtp것이 아니라 cron 작업이에 ssmtp없기 때문에 호출 된 실행 파일을 찾지 못하는 것 PATH입니다. "사용자"와 같은 것은 없습니다 PATH. 이는 사용자 별 설정이 아니라 프로세스 별 설정입니다. PATH=…crontab에 줄 을 넣어 모든 cron 작업의 경로를 설정할 수 있습니다 .
Gilles

PATH 설정과 함께 작동하도록 MAILTO='XXXX@gmail.com '을 추가해야했습니다. 이상하지만 그것은 나를 위해 일했습니다.
mac

ssmtp의 경우 사용할 수 있습니다. ´which ssmtp´ ...
Fredrick Gauss

@FredrickGauss 확인type ssmtp
Gilles

20

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

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

14

질문 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

7

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

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

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


3

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


1

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

@Kusalananda의 우수한 의견 채택.


1
아니오. 시스템이 홈 디렉토리를 유지하는 위치에 따라 다릅니다. /home보편적이 아닙니다.
Kusalananda

1
@Kusalananda LSB 표준은 말한다 /home.
peterh

1
@peterh 글쎄, macOS 사용 /Users및 역사적 Unices 사용 /usr, 심지어 Linux에서도 시스템 사용자의 홈 디렉토리가 어딘가 /var또는 다른 곳에 있을 수 있습니다 .
Kusalananda

1
@Kusalananda 맞습니다.
peterh

감사합니다, 당신은 실제로이 질문에 대답 한 유일한 사람입니다 :)
OwN

0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.