我正在运行 docker 容器的 NAS 中开发备份脚本。在我的容器内,我使用 /etc/crontab 运行 cron:
root@backups-nas:/code# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
0 * * * * root /code/backup.sh
我还安装了 syslog-ng,因此我可以在 /var/log/syslog 中查找日志,其中出现了我的任务:
root@backups-nas:/code# tail -f /var/log/syslog
==> /var/log/syslog <==
Mar 24 19:00:01 backups-nas CRON[9250]: (root) CMD (/code/backup.sh)
我的脚本内容是这样的:
root@backups-nas:/code# cat backup.sh
#!/bin/bash
python3 /code/backup.py all >> /code/log/$(date +\%d-\%m-\%Y).log
但是到了晚上,/code/log/$(date +\%d-\%m-\%Y).log 中没有新的日志写入器,任务未完成。如果我尝试手动执行 /etc/crontab 行,它会起作用。
您认为发生了什么?提前致谢
编辑:
我编辑了 backup.py,如下所示:
#!/usr/local/bin/python3
from sys import argv
import datetime
如果我直接运行脚本可以工作,但是 cron 不会运行它,尽管 /var/log/syslog.txt 中的行。
答案1
在系统 crontab 文件中,将变量的值设置PATH
为/sbin:/bin:/usr/sbin:/usr/bin
。这确实不是包括你的解释器的路径python3
,其中你说位于/usr/local/bin/python3
。
这意味着您需要执行以下操作之一:
- 添加。
/usr/local/bin
PATH
您可以在 crontab 文件中通过修改该PATH=
行来执行此操作(这将影响系统 crontab 文件中的所有作业),或者在调用 Python 备份脚本之前在backup.sh
脚本中使用, 来执行此操作。PATH=$PATH:/usr/local/bin
当您调用 Python 脚本时,请使用带有显式路径的 Python 解释器,如下所示
/usr/local/bin/python3 /code/backup.py all >> "/code/log/$(date +%d-%m-%Y).log"
(请注意,
%
此处的字符不必转义)。通过完全不指定显式解释器来依赖脚本
#!
的 -line中指定的解释器:/code/backup.py
/code/backup.py all >> "/code/log/$(date +%d-%m-%Y).log"
这依赖于脚本的第一行
backup.py
是#!/usr/local/bin/python3
,并且该脚本是可执行的 (chmod +x /code/backup.py
)。
在这些变体中,“最好”(个人意见)是最后一个变体。
答案2
刚刚解决!我可以调试它,在 tmp 中添加一个日志,而不是在我的 .sh 中,在我的 /etc/crontab 中。
问题很简单:我使用的是相对路径而不是绝对路径。但我的 .sh 内的回声没有显示任何内容。