cron에서 "소스"를 사용할 수 없나요?

cron에서 "소스"를 사용할 수 없나요?

을 사용하려면 cronjob이 필요한 도커 컨테이너를 설정 중입니다 awscli.

cron 작업이 docker 컨테이너의 환경 변수에 액세스할 수 없는 문제가 있습니다. 시작 작업을 할 때 모든 환경 변수를 파일로 인쇄합니다 printenv > /env.

cron 작업에서 사용 하려고 하면 source(crontab에서 직접 시도하고 crontab에서 호출하는 스크립트에서 시도했지만) 작동하지 않는 것 같습니다.

문제를 보여주기 위해 프로젝트의 단순화된 버전을 만들었습니다.( rsyslog로깅에 포함됨):

도커파일:

FROM debian:jessie

# Install aws and cron
RUN apt-get -yqq update
RUN apt-get install -yqq awscli cron rsyslog

# Create cron job
ADD crontab /etc/cron.d/hello-cron
RUN chmod 0644 /etc/cron.d/hello-cron

# Output environment variables to file
# Then start cron and watch log
CMD printenv > /env && cron && service rsyslog start && tail -F /var/log/*

예약 된 일들:

# Every 3 minutes try to source /env and run `aws s3 ls`.
*/3 * * * * root /usr/bin/env bash & source /env & aws s3 ls >> /test 2>&1

컨테이너를 시작하면 /env변수가 생성되었지만 가져오지 못하는 것을 볼 수 있습니다.

답변1

먼저, 명령(음, 쉘 내장)의 이름은 입니다 source. 이라는 스크립트를 작성하여 대신 원하는 곳에 source넣지 않는 한 ./source/source

다음 문제는 cron일반적으로 가지고 있는 것을 무엇이든 사용한다는 것인데, /bin/sh그것은 sourcebashism(또는 다른 더 복잡한 쉘)입니다. 가지고 다닐 수 있는,POSIX 호환 명령소스 파일은 .다음과 같습니다 source.

*/3 * * * * root /usr/bin/env bash & . /env & aws s3 ls >> /test 2>&1

또한, 나는 그것이 무엇을 해야 하는지 잘 이해하지 못합니다. Bash 세션을 시작하고 이를 백그라운드로 보내는 요점은 무엇입니까? bash를 사용하여 후속 명령을 실행하려면 다음이 필요합니다.

*/3 * * * * root /usr/bin/env bash -c '. /env && aws s3 ls' >> /test 2>&1

또한 내가 아는 한 백그라운드에서 구매를 수행하는 것이 의미가 없기 &때문에 으로 변경했습니다 .&&

답변2

.다음과 같이 사용할 수 있습니다 .테든의 답변/bin/sh기본적으로 cron이 사용되며 가끔 명령어를 인식하지 못하는 경우가 있다고 언급되었습니다 source.

한 가지 더 추가하고 싶습니다. 파일을 가져와 두 번째 명령에서 사용할 수 없으므로 다음과 같은 작업이 작동하지 않을 수 있습니다.

* * * * * source ~/.bash_profile
* * * * * do some stuff with bash_variables

각 줄은 세션 자체이므로 첫 번째 명령의 소스 변수는 후속 명령에서 사용할 수 없습니다. 당신은 이것을 해야 합니다:

* * * * * source ~/.bash_variable && do some stuff with bash_variables

관련 정보