crontab 실행은 사용자 실행과 동일한 환경 변수가 없습니다.


20

crontab 작업 0 2 */1 * * /aScript >aLog.log 2>&1을 'root'사용자로 실행 했지만 env가 'root'사용자의 env와 다르므로 스크립트의 런타임 동작이 다릅니다.

시도 수정은 rc.d 파일에 내보내기 명령을 배치했지만 여전히 표시되지 않았습니다! 내보내기 스크립트를 aScript 자체 에 습니다.

내 질문은이 문제에 접근하는 더 좋은 방법이 있습니까? 왜 동일한 사용자 'root'에서 온 env가 누락 되었습니까? (나는 루트에서 'crontab -e'를 실행하여 crontab을 수정합니다)


8
Cron은 항상 빈 환경에서 실행됩니다. HOME, LOGNAME 및 SHELL이 설정됩니다. 매우 제한된 PATH. 모든 변수를 직접 설정하지 않으려면 source(bash) 프로필을 사용하십시오.
cyberx86

2
@ cyberx86 : 왜 답변으로 작성하고 담당자를 얻습니까?
user9517은

2
@Iain : 담당자는 항상 환영합니다. 그러나 때로는 한 줄로 대답해도 실제로 담당자를 얻지 못하는 것 같습니다. 간결한 답변이 그 자리에 있다는 것을 완전히 인정하지만, 도움을 제공하고 싶었을 때 주석을 '쉬운 방법'으로 사용했지만 (오전 1시) 자세한 설명을 쓰지 않았습니다. ..). 그러나 나는 당신의 조언을 받아 이것에 대해 조금 확장하고 답변으로 추가 할 것입니다.
cyberx86

@ cyberx86 : 부정확하거나 아무것도없는 것보다 올바른 라이너 하나를 사용하는 것이 좋습니다.
user9517은

답변:


31

Cron은 항상 빈 환경에서 실행됩니다. HOME, LOGNAME 및 SHELL이 설정됩니다. 매우 제한된 PATH. 따라서 실행 파일에 대한 완전한 경로를 사용하고 cron을 사용할 때 스크립트에 필요한 모든 변수를 내보내는 것이 좋습니다.

cron에서 환경 변수를 설정하는 데 사용할 수있는 방법은 여러 가지가 있지만 모두 스크립트에서 설정하는 것과 같습니다.

접근법 1 :

스크립트에서 수동으로 필요한 각 변수를 설정하십시오.

접근법 2 :

귀하의 프로필을 소싱하십시오 :

. $HOME/.bash_profile(또는 . $HOME/.profile)

(일반적으로 위 파일이 다른 파일을 소스로 사용한다는 것을 알게 될 것입니다 (예 : ~ / .bashrc-> / etc / bashrc-> /etc/profile.d/*)-그렇지 않은 경우 해당 파일도 소스로 사용할 수 있습니다.)

접근법 3 :

환경 변수를 파일에 저장하십시오 (원하는 사용자로 실행).

env > /path/to/my_env.sh

그런 다음 cron 스크립트를 통해 가져 오십시오.

env - `cat /path/to/my_env.sh` /bin/sh

접근법 4 :

경우에 따라 전역 cron 변수를 설정할 수 있습니다 /etc/default/cron. 그러나 모든 크론 작업에 대해 설정되므로 위험 요소가 있습니다.


접근 방식 2는 암호, API 키 등 env vars에서 디스크에 부딪치지 않아야하는 민감한 사항이있는 서버에 가장 적합합니다.
ap

접근법 4는 도커 엔진이 env vars를 설정하는 도커 환경에서 나를 위해 일했습니다. 그래도 작동하려면 Docker 진입 점에 환경을 저장해야했습니다. 전체 솔루션은 여기에 있습니다 : github.com/rayyanqcri/swarm-scheduler
hammady

접근법 3에 대해 자세히 설명해 주시겠습니까? 가져 오려고하면 다음과 같이됩니다.bash: SHELL=/bin/bash: No such file
KuboMD

1

Cron은 실행할 용도로 지정된 OWN 쉘을 작성합니다.

따라서 동일한 사용자 변수를 유지하려면 루트 또는 다른 사용자 대신 자신의 사용자로 변수를 실행하십시오.

또는

가장 좋은 방법은 해당 변수를 자신의 스크립트로 내보내는 것입니다.


1

RedHat CentOS에서는 /etc/rc.d/init.d/functions 기본 PATH를 영구적으로 설정할 수 있습니다. /etc/rc.d/crond는 시작할 때 기능을 호출합니다.


0

AWS에서도 비슷한 문제가있었습니다. 그렇게 알아 냈어

which python3

나에게 /usr/bin/local/python3위치를 주었다

그리고

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.