Bash不能使用來自 cron 的
不能使用來自 cron 的source
?
我正在設置一個 docker 容器,它需要一個 cronjob 來使用
awscli
.我在 cron 作業能夠訪問 docker 容器的環境變數時遇到問題。當我在啟動時工作時,我將所有環境變數列印到一個文件
printenv > /env
中。當我嘗試
source
從 cron 作業中使用時(我已經直接在 crontab 和 crontab 呼叫的腳本中嘗試過),它似乎不起作用。我製作了我的項目的簡化版本來展示這個問題*(包括
rsyslog
日誌記錄)*:Dockerfile:
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/*
crontab:
# 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
是用我的變數創建的,但它永遠不會被獲取。
首先,命令的(好吧,shell 內置的)名稱是
source
. 除非你已經寫了一個腳本叫做source
並把它放進去/
,你想要source
而不是/source
。下一個問題是,
cron
通常使用你所擁有的任何東西,/bin/sh
並且source
是 bashism(或其他更複雜的 shell)。用於獲取文件的可移植、符合 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
我也將其更改為
&
,&&
因為據我所知,在後台採購是毫無意義的。