【问题标题】:Running crontab with python使用 python 运行 crontab
【发布时间】:2013-09-02 00:59:34
【问题描述】:

Python crontab 脚本似乎不起作用。当我手动运行它时,

python /home/ec2-user/code1.py

它工作正常,但是当放入 crontab 的 cron.txt 文件时,就不行了。

我的 crontab 文件是:

 @hourly python /home/ec2-user/code1.py >/dev/null 2>&1

我也试过

0    *    *    *    * python /home/ec2-user/code1.py >/dev/null 2>&1

但两人都没有多少运气。

sudo crontab -l
@hourly python /home/ec2-user/code1.py >/dev/null 2>&1

显示所有功能。 我尝试了Crontab not running my python script 和其他几个运气不佳的人。

编辑:

PATH=/opt/python2.7/bin  
MAILTO=my@email
*/5 * * * * /home/ec2-user/code1.py

我收到的电子邮件是:

 /bin/sh: /home/ec2-user/code1.py : No such file or directory

但我可以打开和编辑文件没问题。我尝试了很多不同的东西,但归结为:cron 看不到文件。

感觉就像我经历了整个https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work 还是没有运气

【问题讨论】:

  • 检查 cron 是否实际运行 - 它可能不够充分但关闭 VM 映像。
  • 忽略重定向到 /dev/null 并查看您收到的电子邮件:cron 会将 stdout/stderr 发送给所有者(在本例中为 root)。在crontab 条目中使用完整路径/usr/bin/python 通常是一个好主意,因为您无法确定PATH 是什么。
  • @rodling:啊哈!您的问题很可能是 cron 找不到您的 python 解释器。 cron 的默认路径通常只是/usr/bin:/bin,因此一种替代方法是将PATH=/opt/python2.7/bin 添加到crontab 的顶部。一个更好的解决方案可能是下面的 Thor 给出的,但是脚本中的 shebang 行必须是 python 解释器的完整路径,例如#!/opt/python2.7/bin/python,不仅仅是包含目录。
  • 您如何判断您的脚本是否有效?它会创建一个文件吗?因为您将输出发送到/dev/null,正如@Emmet 提到的那样,它不会像您“手动”运行它时那样提供反馈。如果它真的很安静,也许给它一些输出只是为了调试。您也可以在 crontab 文件的顶部添加 MAILTO=your.address 以获取错误报告。
  • @roding,您应该只使用crontab -e 编辑crontab,将VISUALEDITOR 环境变量设置为启动编辑器的crontol。 (因为你是从记事本开始的,所以我认为你不喜欢 vim。)

标签: python linux crontab


【解决方案1】:

您是否检查了以下几点?

  • 您的脚本可执行吗? chmod 700 code1.py

  • 代码的第一行应该是,大多数情况下python都安装在这个地方

    • #!/usr/bin/python

之后应该执行如下的crontab

0    *    *    *    * /home/ec2-user/code1.py >/dev/null 2>&1

【讨论】:

  • 我尝试了 chmod 并没有发生任何事情我在顶部添加了#!/opt/python2.7/bin,这就是我的 2.7 所在的位置。那是正确的目录还是应该删除bin?同样在您的 crontab 中,shebang 删除了运行它的程序,因此在代码目录之前不需要python
  • @rodling:shebang 行不在 crontab 中,它在您的脚本中。 shebang“#!”必须是文件中的前两个字符(前面没有空格或空行),并且解释器可执行文件的完整路径,而不仅仅是包含目录,必须出现在同一行,例如#! /opt/python2.7/bin/python
【解决方案2】:
  1. 验证 cron 正在运行:ps aux | grep [c]ron 应该显示正在运行的 cron 进程
  2. 从命令中删除重定向,以便 cron 将输出通过电子邮件发送给您
  3. 在您的 crontab 中添加 MAILTO=<email address>,以便您收到电子邮件
  4. 在命令中放入 python (/opt/python2.7/bin/python) 的完整路径,而不仅仅是 python
  5. 向 crontab 添加另一个命令,例如 echo FOOBAR,并验证您是否收到了电子邮件。
  6. ls -l /homeec2-user/code1.py ?应该是/home/ec2-user/code1.py
  7. 仅使用crontab -e 编辑用户的 crontab,切勿从其他平台或直接编辑文件。
  8. 运行crontab -l | cat -A,以便我们验证所有控制字符是否正确。

【讨论】:

  • email 工作 终于遇到了一个错误,上面写着/bin/sh: /homeec2-user/code1.py : No such file or directory
  • @rodling 真的是/home/ec2-user/code1.py - 好像少了一个/ - /home/ec2-user/code1.py
  • 这只是我的错误,而不是实际代码。它在代码中有正确的/
  • 我执行了您建议的ps 命令。它似乎正在运行。我为 python 做了完整的扩展,而不仅仅是 python,我创建了虚拟 crontab Foobar,我在我的电子邮件中收到了它以及 python one 的错误代码
  • @roding.. 罪魁祸首是那些^M$。重来; crontab -r按照步骤 7。 就像我对问题发表的评论一样,您可以设置 EDITOR 来控制启动哪个编辑器。记事本用户更喜欢pico 而不是vim
【解决方案3】:

如果错误消息被正确复制/粘贴,似乎表明 crontab 文件存在问题。如果您在国外平台上创建它,最好从一个空文件重新开始,这次是在本机编辑器中创建它。

正如其他人已经指出的那样,将输出和错误重定向到/dev/null 基本上会使调试变得不可能,所以不要这样做。如果您的程序创建了大量冗长的无信息输出,请在过滤掉琐碎诊断的包装器中运行它,或者,如果它是您自己的程序,则重写它以在正常操作中静默运行。

【讨论】:

  • crontab 基本上看不到文件。我跑了ps aux | grep [c]ron,它似乎工作。程序 100% 运行,电子邮件只是说 /opt/python2.7/bin/python: can't open file '/home/ec2-user/code1.py': No such file or directory
【解决方案4】:

您是否尝试使用“/usr/bin/python”而不是“python”?

ps 斧头 | grep 蟒蛇 将为您提供可以使用的路径。

【讨论】:

    【解决方案5】:

    试试这个命令,希望你的 python 在哪里:

    which python
    

    你很可能会有类似的东西

    /usr/bin/python /home/ec2-user/code1.py
    

    【讨论】:

      猜你喜欢
      • 2014-07-17
      • 2021-09-10
      • 2016-06-18
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 2017-12-16
      • 2015-09-29
      相关资源
      最近更新 更多