系统级cron中的环境变量

时间:2019-08-07 14:16:16

标签: python shell docker cron debian

最近,我不得不从基于python Alpine 的图像切换到所谓的python:3.7.2-slim(基于 Debian )。我的cron作业似乎不再起作用,因为环境变量不再可用于cron。我通过以下测试脚本得出了这个结论:

# run.py
import os, sys
with open("/var/log/lastlog", "a") as f:
    try:
        user = os.environ['INFLUXDB_USER'] or "None"
        f.write("I am running python as {} with {}\n".format(user, sys.version_info[:3]))
    except Exception as e:
        f.write("I failed: {}\n".format(str(e)))

和这个crontab

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
# ADDED 
*/1 * * * * root . /root/.bashrc; python3.7 /usr/src/collector/run.py
*/1 * * * * root echo 'hi' >> /var/log/lastlog

异常表明,当脚本由cron运行时找不到INFLUXDB_USER,而在手动运行时(或在python shell中询问os.environ['INFLUXDB_USER']时发现)。

我尝试过的

  • 提供命令(通过在命令前面添加. /root/.bashrc;(也尝试使用. /root/.profile;
  • 将其放入source /root/.bashrc之后的独特的shell脚本
  • 使用绝对路径
  • 使用bash登录名来运行命令source
  • cron.d中移动说明
  • 使用crontab-e添加命令,而不是直接编辑/etc/crontab

由于/etc/environment中未定义ENV变量,因此我不确定此“ 系统范围克隆”是否可以任何方式访问它们。与我必须在Alpine中进行编辑的/etc/crontab/root(立即起作用)相比,我发现这个cron令人困惑。您如何处理“ 系统级crontab ”?这是Debian的特殊性吗?

修改

  • 版本:cron/oldstable,now 3.0pl1-128+deb9u1 amd64
  • 用Docker定义的
  • env变量存储在/proc/1/environ中(但采购它并没有改变)

1 个答案:

答案 0 :(得分:0)

我能找到的唯一直接的方法是通过稍微调整Docker映像的/etc/crontab来直接在entrypoint.sh中编写变量。这是通过 sed

SHELL=/bin/sh之后添加内容的一种方法
sed -i "/SHELL=\/bin\/sh/a INFLUXDB_USER=$INFLUXDB_USER" /etc/crontab
sed -i "/SHELL=\/bin\/sh/a PROJECT_NAME=$PROJECT_NAME" /etc/crontab
sed -i "/SHELL=\/bin\/sh/a INFLUXDB_USER_PASSWORD=$INFLUXDB_USER_PASSWORD" /etc/crontab
sed -i "/SHELL=\/bin\/sh/a INFLUXDB_DB=$INFLUXDB_DB" /etc/crontab

printf "3 */1 * * * root python /usr/src/collector/coin.py fetch cmc\n" >> /etc/crontab
printf "30 0 * * 4 root python /usr/src/collector/coin.py fetch gt --mode weekly\n" >> /etc/crontab

service cron restart
chmod 640 /etc/crontab

我对此不太满意,因此欢迎任何更优雅的解决方案。