다음 crontab 명령을 사용하여 매일 코드 베이스를 업데이트하려고 했습니다. 그러나 테스트했을 때 첫 번째 단계 자체가 작동하지 않았습니다.
27 15 * * * . cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * . cd /home/covuser/user && . /home/covuser/user/checkout.sh
conf.sh에는 코드 체크아웃에 필요한 환경 변수가 포함되어 있습니다. checkout.sh 파일은 체크아웃 프로세스를 수행합니다.
첫 번째 줄은 필요한 환경 변수를 설정해야 합니다. 그러나 그것은 일어나지 않습니다.
이것에 어떤 실수가 있었습니까? 미리 감사드립니다.
답변1
crontab의 각 줄은 독립적으로 예약되고 실행되는 별도의 작업을 나타냅니다.
이는 특히 귀하의 경우 서로 다른 쉘 세션에서 실행되므로 한 작업에서 일부 환경 변수를 설정하기 위해 스크립트 파일을 소싱해도 나중에 다른 작업이 실행될 환경에 영향을 미치지 않는다는 것을 의미합니다.
프로세스를 변경하고 동일한 쉘 세션 내에서 두 스크립트를 모두 실행해야 하므로 동일한 크론 작업에서 가장 쉽게 실행할 수 있습니다.
실행 사이에 지연이 필요한 경우 sleep
고정된 나중 시간으로 다른 작업을 예약하는 대신 이를 달성할 수 있습니다.
아, 물론 다른 의견과 답변에서 지적했듯이 .
하위 쉘 대신 현재 쉘 환경에서 실행되도록 소스 스크립트만 사용할 수 있습니다. 하지만 은 cd
스크립트가 아니라 내장된 쉘 명령이므로 어쨌든 항상 현재 쉘 환경에서 실행되므로 작성하는 것도 . cd somehwere
오류입니다.
답변2
나는 문제가 .
이전 의 cd
.
.
(별칭 fro source
)을 사용하면 파일 소스를 얻을 수 있습니다. 와 같은 쉘 내장 기능은 cd
소스로 제공될 수 있는 실행 파일이 아니기 때문에 작동하지 않습니다 .
두 명령을 AND - 로 연결하면 &&
쉘은 결과 값( false && true == false
)을 변경하지 않으므로 실패한 명령 다음의 모든 명령을 건너뜁니다. 다른 동작을 원할 경우 the를 &&
a로 바꿀 수 있습니다 .;
이것은 작동합니다 :
27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * cd /home/covuser/user && . /home/covuser/user/checkout.sh
업데이트: 스크립트가 종속적이라면(제 생각엔 그럴까요?) 단일 세션에서 모든 것을 실행하세요. (각 cron 항목을 실행하기 위해 새로운 bash 세션이 열립니다)
27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh && . /home/covuser/user/checkout.sh