을 사용하려면 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
그것은 source
bashism(또는 다른 더 복잡한 쉘)입니다. 가지고 다닐 수 있는,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