无法使用 cron 中的“source”?

无法使用 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/*

定时任务:

# 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

首先,命令的(好吧,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

我也将其更改为,&因为&&据我所知,在后台进行采购是毫无意义的。

答案2

您可以使用.since作为特登的回答已经提到 cron/bin/sh默认使用并且有时不识别source命令。

我想再添加一件事:您无法获取文件并在第二个命令中使用它,因此这样的操作可能不起作用:

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

因为每一行都是会话本身,所以第一个命令中的源变量在后面的命令中将不可用。你必须这样做:

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

相关内容