从Cron.d运行Python脚本

0 投票
1 回答
1774 浏览
提问于 2025-04-17 03:52

我正在尝试在Ubuntu上通过安装在/etc/cron.d/mycron的定时任务来运行一个Django管理命令。

我首先通过在/etc/cron.d/mycron中写入以下内容来测试我的基本设置:

* * * * * root command echo "Test $(date)" 2>&1 >> /tmp/mycron.log

我确认/tmp/mycron.log每分钟更新一次,并且包含了我预期的文本。

然后我尝试了以下几种变体,使用我的实际管理命令:

* * * * * root command python /path/to/my/script/manage.py mycommand 2>&1 >> /tmp/mycron.log

* * * * * root command /usr/bin/python /path/to/my/script/manage.py mycommand 2>&1 >> /tmp/mycron.log

* * * * * root command /path/to/my/script/manage.py mycommand 2>&1 >> /tmp/mycron.log

* * * * * python /path/to/my/script/manage.py mycommand 2>&1 >> /tmp/mycron.log

* * * * * /path/to/my/script/manage.py mycommand 2>&1 >> /tmp/mycron.log

* * * * * /usr/bin/python /path/to/my/script/manage.py mycommand 2>&1 >> /tmp/mycron.log

尽管日志文件生成了,但里面没有我管理命令输出的预期日志文本。

在每次变更后,我都会运行sudo touch /etc/cron.d/来重新加载定时任务。即使我的Python代码有错误,我也希望能看到某种错误信息被记录下来。

我检查了tail -f /var/log/syslog,它显示的唯一错误是那些不以“root”开头的定时任务,它给我的错误是:

Error: bad username; while reading /etc/cron.d/mycron

对于其他的,我看到类似这样的信息:

Oct  7 10:54:01 localhost CRON[27805]: (root) CMD (/path/to/my/script/manage.py mycommand 2>&1 >> /tmp/mycron.log)

但是日志中没有任何内容被写入,而我期待的数据库更改也没有发生。我到底做错了什么呢?

1 个回答

3

你需要的输出结果要么在 /tmp/mycron.log 里,要么会发到 root 的邮箱。你可以在 root 下输入 mail 来查看。

另外,你为什么要尝试不同的写法呢?crontab 文件的语法是严格规定的(可以通过 man crontab -S 5 查看),对于 /etc/crontab 来说,它的格式是:

min hour day month weekday user cmdline

而个人的 crontab 格式是:

min hour day month weekday cmdline

/etc/crontab 中,你不能省略用户名,也不能用 /usr/bin/python 来代替用户名。

而且你不需要写 command 这个词,它之所以能用,是因为有一个内置的 bash 函数叫这个名字,它实际上只是执行它的参数里的命令。

正确的行应该是以下任意一种:

* * * * * root /path/to/my/script/manage.py mycommand 2>&1 >> /tmp/mycron.log
* * * * * root /usr/bin/python /path/to/my/script/manage.py mycommand 2>&1 >> /tmp/mycron.log

在第一种情况下,manage.py 必须是可执行的(可以用 chmod +x manage.py 来设置),而且它的第一行必须是 #!/usr/bin/python,或者你实际使用的 Python 解释器的路径。

撰写回答