【问题标题】:Can't get Crontab to work无法让 Crontab 工作
【发布时间】:2011-09-14 15:02:28
【问题描述】:

我一直试图让 crontab 工作一段时间,但它似乎不想工作。我需要在每个午夜初始化的 python 脚本在命令终端上完美运行。我的python脚本的位置是:

/home/rv/ncbi-blast-2.2.23+/database_backup/backup.py

我的 contab 如下所示:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/rv/ncbi-blast-2.2.23+/database_backup
MAILTO=root
HOME=/
# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *  command to be executed
0 0 * * * /usr/bin/python /home/rv/ncbi-blast-2.2.23+/database_backup/backup.py

我的 python 脚本如下所示:

#!/usr/bin/python

from subprocess import Popen
import datetime

today = datetime.date.today()

today = str(today)

#print today

f = open("/home/rv/ncbi-blast-2.2.23+/database_backup/%s.sql" % (today), "w")
x =  Popen(["mysqldump", "-u", "root", "-p*****", "normalisation"], stdout = f)
x.wait()
f.close()

知道我哪里出错了吗?


刚刚查看了 cron 日志,每次尝试输入时我都会得到这个

(root) BAD FILE MODE (/etc/crontab)

我在尝试使用 shell 脚本时也遇到了同样的错误

【问题讨论】:

  • 愚蠢的问题,但是 cron 守护进程正在运行吗?
  • 您的 crontab PATH 不包括 /usr/local/bin。但是你的 python shebang 行引用了/usr/local/bin/python。或许将 /usr/local/bin 添加到 crontab PATH,和/或显式调用脚本:0 0 * * * /usr/local/bin/python /home/rv/ncbi-blast-2.2.23+/database_backup/backup.py
  • "-p*****" 应该是'-p', '*****',
  • 如果它以 root 身份运行,cwd 将是 /,如果可以的话,你会在那里写你的文件。还要检查您的本地邮件,如果有的话,cron 应该将输出邮寄给您,例如当事情失败时。
  • 脚本有执行权限吗?您是通过 crontab 命令还是使用编辑器编辑了 crontab(不要这样做)?

标签: python linux crontab


【解决方案1】:

也许不使用 Python,而是制作一个 bash 脚本:

mysql_backup.sh

#!/bin/bash
/PATH/TO/mysqldump -u root -p***** normalisation > /SOMEOTHER/PATH/TO/$(date '+%Y-%m-%d').sql

并将其放在您的 crontab 中:

0 0 * * * /PATH/TO/mysql_backup.sh 

【讨论】:

  • 您可以将脚本放在/usr/local/sbin 通常用于系统管理的本地安装程序的位置。
  • 我尝试了一个 shell 脚本,但还是没有运气,查看了 cron 日志,发现:“(root)错误文件模式(/etc/crontab)”
  • 根据ehow.com/how_4397618_bad-file-mode-cron-errors.html,如果/etc/crontab没有正确的权限,可能会出现BAD FILE MODE错误。也许试试sudo chmod 644 /etc/crontabsudo chown root:root /etc/crontab。另外——如果您使用的是系统范围的 /etc/crontab,而不是个人 crontab,那么 crontab 的格式会有些不同。请改用0 0 * * * root /PATH/TO/mysql_backup.sh。第 6 个字段 (root) 指定运行脚本的用户。请参阅man 5 crontab,标题为EXAMPLE SYSTEM CRON FILE 的部分。
【解决方案2】:

如果它在您的用户帐户中工作,但不能通过 cron 工作,则通常不是 cron。 cron 守护进程会尝试启动您的应用程序,但由于它没有设置环境变量,因此会失败。创建一个简单的 shell 脚本来设置您的环境变量并启动您的 python 脚本。 (您没有 PATH,因此您必须使用完整路径名等)

查看您的脚本,您只需使用 shell 脚本命令即可轻松完成所有这些操作。 Shell 脚本被严重低估了。

【讨论】:

  • 我同意,像 Python 这样的东西只会让它变得更加冗长。 bash 脚本更适合。这可能是正确的答案; PATH 问题是 cron 作业无法正常工作的第一大罪魁祸首。我通常只在 cron 作业中使用完整路径以避免麻烦。
【解决方案3】:

您可以只检查 crontab cmd,然后手动执行这些 cmd,例如

/usr/bin/scrond run-parts /etc/cron.daily

【讨论】:

    【解决方案4】:

    我不知道你哪里出错了,但你可以将 stderr 和 stdout 重定向到你的 crontab 条目中的一个文件,这可能会给你一个提示。我的语法记忆已生锈,但类似于<yourfile>.py &> errors.txt

    当然,这也引入了另一个失败点,就是你没有权限写到你放errors.txt的地方。 ;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-02
      • 2017-07-13
      • 1970-01-01
      • 2014-03-23
      • 2013-03-23
      • 2020-12-15
      • 2013-06-02
      相关资源
      最近更新 更多