데이터베이스를 덤프하고 SQL 파일을 Swift에 업로드하는 스크립트가 있습니다. 터미널에서는 잘 실행되지만 cron에서는 실패하는 스크립트에 문제가 있습니다.
/usr/local/bin/swift
디버깅을 한 후에 스크립트에서 해당 명령을 찾을 수 없다는 것을 발견했습니다 .
이것은 내 crontab 항목입니다.
*/2 * * * * . /etc/profile; bash /var/lib/postgresql/scripts/backup
내가 시도한 것은 다음과 같습니다.
swift
다음의 전체 경로를 사용하십시오./usr/local/bin/swift
/etc/profile
bash 스크립트를 실행하기 전에 스크립트를 실행하십시오.
이 문제를 어떻게 해결할 수 있나요?
답변1
Cron은 사용자와 동일한 환경에서 실행되지 않습니다. 다음을 수행하면 무슨 뜻인지 알 수 있습니다.
터미널 프롬프트에 입력 env
하고 출력을 기록해 둡니다.
그런 다음 이와 같은 크론 작업을 설정하고 그 출력을 이전 작업과 비교합니다.
*/5 * * * * env > ~/output.txt
사용자와 동일한 변수가 crontab
없기 때문에 문제가 발생할 가능성이 가장 높다는 것을 알게 될 것입니다 . PATH
해결책으로 (postgres 사용자로부터) echo $PATH
결과를 crontab의 첫 번째 줄에 복사할 수 있습니다(이와 같은 것).
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/jbutryn/.local/bin:/home/jbutryn/bin
또는 좀 더 구체적으로 설명하고 싶다면 다음을 추가하면 됩니다.
PATH=$PATH:/usr/local/bin
그러나 나는 일반적으로 이 작업을 수행하지 말아야 할 타당한 이유를 듣지 못했고 그렇지 않으면 이 문제가 다시 발생할 수 있기 때문에 항상 사용자의 PATH를 crontab에 넣습니다.
답변2
가장 흔한 일을 하셨군요예약된 작업 오류. 특정 환경을 사용하는 경우 $PATH에 경로를 추가합니다.
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/sbin:/usr/bin:/script
export PATH
또한 cron 로그(/var/log/cron 또는 /var/log/syslog)를 확인하세요. 그리고 바이너리에 대한 사용자의 권한을 확인하십시오.