cron 任务不起作用

cron 任务不起作用

我正在运行 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/binPATH您可以在 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 内的回声没有显示任何内容。

相关内容