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 변수를 어떻게 설정합니까? 또는 더 나은 방법-경로를 추가하는 방법은 무엇입니까?
답변
사용자 crontab (crontab -e를 사용하여 편집)은 비슷하지만 시스템 crontab (/ etc / 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 또는 기타 환경 변수를 특별한 것으로 설정하면 명령에도 포함됩니다.
답변
기본 시스템 전체 PATH 및 기타 ENV 변수 (/etc/profile.d에 정의 됨)가 필요한 경우 다음을 입력하십시오.
* * * * * . /etc/profile; your cmd
답변
cronjob 라인 또는 단일 라인에서 PATH (또는 다른 매개 변수)를 설정할 수 있습니다. 그러나 같은 쉘 확장을 사용할 수 없습니다 PATH=$PATH:/usr/local/bin
. 그러나 물결표는 홈 디렉토리 바로 가기에 허용됩니다.
책에서 :
crontab의 활성 줄은 환경 설정 또는 cron 명령입니다. 환경 설정의 형식은 다음과 같습니다. name = value 여기서 등호 (=) 주위의 공백은 선택 사항이며 값의 선행 공백이 아닌 공백은 name에 지정된 값의 일부입니다. 선행 또는 후행 공백을 유지하기 위해 값 문자열을 따옴표 (단일 또는 이중이지만 일치)로 배치 할 수 있습니다.
자세한 내용 man 5 crontab
은 참조하십시오.
따라서 이것은 작동해야합니다.
PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
답변
나는 같은 문제가 있었고 crontab에서 스크립트를 실행하는 다른 방법을 찾았습니다. 프로그램을 실행하는 가장 쉬운 방법은 프로그램 디렉토리로 cd 할 수있는 스크립트를 만드는 것 입니다. 그런 다음 해당 스크립트에서 프로그램을 호출하십시오.
다음은 스크립트의 예입니다 (스크립트 이름 = launcher.sh).
#!bin/bash
cd /home/pi/test
sudo python3 example.py
그런 다음 스크립트를 실행 가능하게 만드십시오.
chmod 755 launcher.sh
그리고 마지막으로 스크립트를 crontab에 추가하십시오.
crontab -e
이 줄을 끝에 추가하십시오.
@reboot sh /home/pi/test/launcher.sh
(재부팅 할 때마다 프로그램이 실행되도록 설정했습니다)