crontab에서 스크립트를 실행하는 데 문제가 있습니다. 조사한 결과 PATH 매개변수에 /sbin이 포함되어 있지 않기 때문에 문제가 발생한다는 것을 알게 되었습니다.
/etc/crontab에 포함된 내용을 살펴보았습니다.
PATH=/sbin:/bin:/usr/sbin:/usr/bin
테스트 - PATH 변수를 인쇄하는 간단한 크론 작업:
* * * * * echo $PATH &> /root/TMP.log
출력은 다음과 같습니다
cat /root/TMP.log
/usr/bin:/bin
이 동작을 이해하지 못합니다. PATH 변수를 설정하는 방법..? 아니면 더 나은 방법은 무엇입니까? 경로를 추가하는 방법은 무엇입니까?
답변1
비슷하지만 사용자 crontab(crontab -e로 편집)은 시스템 crontab(/etc/crontab 편집으로 편집)과 다르며 시스템 crontab과 별도의 경로에 유지됩니다.
시스템 crontab에는 7개의 필드가 있으며 명령 앞에 사용자 이름이 삽입됩니다. 사용자 crontab에는 6개의 필드만 있으며 명령은 시간 필드 바로 뒤에 삽입됩니다.
마찬가지로 시스템 crontab의 PATH에는 일반적으로 /sbin 디렉토리가 포함되지만 사용자 crontab의 PATH에는 포함되지 않습니다. 사용자 crontab에 대해 PATH를 설정하려면 사용자 crontab에서 PATH 변수를 정의해야 합니다.
cron의 쉘 명령에 일반 PATH를 추가하는 간단한 해결 방법은 로그인 쉘에서 bash를 실행하여 cronjob이 구성 파일을 가져오도록 하는 것입니다. 예를 들어 대신
* * * * * some command
대신 실행할 수 있습니다
* * * * * bash -lc some command
이렇게 하면 구성 파일이 PATH 또는 기타 환경 변수를 특별한 것으로 설정하는 경우 해당 내용이 명령에 포함됩니다.
답변2
PATH(또는 기타 매개변수)는 cronjob 라인 또는 단일 라인에서 설정할 수 있습니다. 그러나 .tilde(~) 문자를 홈 디렉토리에 대한 바로가기로 사용할 수는 없습니다 PATH=$PATH:/usr/local/bin
. MacOS에서는 작동하지만 Linux에서는 작동하지 않는 것 같습니다(적어도 debian/buster의 경우).
책에서 :
crontab의 활성 행은 환경 설정 또는 cron 명령일 수 있습니다. 환경 설정은 name = value 형식입니다. 여기서 등호(=) 주위의 공백은 선택 사항이며 value에서 선행하지 않는 공백은 name에 할당된 값의 일부입니다. 값 문자열은 선행 또는 후행 공백을 유지하기 위해 따옴표(단일 또는 이중, 일치)로 묶을 수 있습니다.
자세한 내용은 을 참조하세요 man 5 crontab
.
그래서 이것은 작동합니다 :
PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
답변3
기본 시스템 전체 경로 및 기타 ENV 변수(/etc/profile.d에 정의됨)를 원하는 경우 다음을 입력하면 됩니다.
* * * * * . /etc/profile; your cmd
답변4
다음과 같이 명령을 확장하면 cron에 일부 로깅을 요청할 수 있습니다.
예를 들어 매번 XX:05에 실행합니다.
5 * * * * /usr/bin/bash -x /path/to/script 2>&1 | tee -a /root/output.cron.txt
cron에서 어떤 문제가 발생했는지 로그를 확인하세요.
마이클 HTH