系统范围的 cron 中的环境变量
environnement variables in system wide cron
我最近不得不从基于 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
但在手动 运行 时找到 INFLUXDB_USER
(或在 python shell).
我试过的
- 获取命令(通过在其前面添加
. /root/.bashrc;
(也尝试了 . /root/.profile;
))
- 在
source /root/.bashrc
之后将其放在 不同的 shell 脚本中
- 使用绝对路径
- 使用 bash 登录到 运行 命令 source
- 将指令移动到
cron.d
- 使用
crontab-e
添加命令而不是直接编辑 /etc/crontab
由于 ENV VARIABLES 未在 /etc/environment
中定义,我不确定此“System Wide Cron”是否可以任何方式访问它们。与我必须在 Alpine 中编辑的 /etc/crontab/root
(它可以立即运行)相比,我发现这个 cron 相当混乱。你如何处理这个“system wide crontab”?这是 Debian 的特性吗?
编辑
- 版本:
cron/oldstable,now 3.0pl1-128+deb9u1 amd64
- 用 Docker 定义的 env 变量存储在
/proc/1/environ
中(但采购它并没有改变任何东西)
我能找到的唯一直接的方法是通过稍微调整 Docker 图像的 entrypoint.sh
直接在 /etc/crontab
中写入变量。这是使用 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
我不是很满意,所以欢迎任何更优雅的解决方案。
我最近不得不从基于 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
但在手动 运行 时找到 INFLUXDB_USER
(或在 python shell).
我试过的
- 获取命令(通过在其前面添加
. /root/.bashrc;
(也尝试了. /root/.profile;
)) - 在
source /root/.bashrc
之后将其放在 不同的 shell 脚本中
- 使用绝对路径
- 使用 bash 登录到 运行 命令 source
- 将指令移动到
cron.d
- 使用
crontab-e
添加命令而不是直接编辑/etc/crontab
由于 ENV VARIABLES 未在 /etc/environment
中定义,我不确定此“System Wide Cron”是否可以任何方式访问它们。与我必须在 Alpine 中编辑的 /etc/crontab/root
(它可以立即运行)相比,我发现这个 cron 相当混乱。你如何处理这个“system wide crontab”?这是 Debian 的特性吗?
编辑
- 版本:
cron/oldstable,now 3.0pl1-128+deb9u1 amd64
- 用 Docker 定义的 env 变量存储在
/proc/1/environ
中(但采购它并没有改变任何东西)
我能找到的唯一直接的方法是通过稍微调整 Docker 图像的 entrypoint.sh
直接在 /etc/crontab
中写入变量。这是使用 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
我不是很满意,所以欢迎任何更优雅的解决方案。