Bash

不能使用來自 cron 的source

  • August 31, 2021

我正在設置一個 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

我也將其更改為&&&因為據我所知,在後台採購是毫無意義的。

引用自:https://unix.stackexchange.com/questions/398106