【问题标题】:Cronjobs run differently (correctly) when command typed at console在控制台输入命令时,Cronjobs 运行不同(正确)
【发布时间】:2018-04-13 14:36:55
【问题描述】:

我在使用 crontab 时遇到了一个奇怪的问题:我在 crontab 中有正确的条目,正确设置了我的路径,但是当作业通过 crontab 运行时,它们的运行方式不同(例如,没有生成日志文件,并且数据是未写入文件)。但是,当我在命令行中键入 EXACT 命令时,脚本会按预期工作。

这不太可能是权限问题,因为我正在以自己的身份运行 cronjobs。

以下是相关细节:

Crontab 条目:

0,30 8-18 * * 1-5 python /home/rascal/work/skunkworks/scripts/python/downloaders/make_whoopy.py

0,30 7-18 * * 1-5 /home/rascal/work/skunkworks/scripts/python/scrapers/funny_quotes.sh

0,30 7-20 * * 1-5 /home/rascal/work/skunkworks/scripts/python/scrapers/even_funnier_quotes.sh

/var/log/syslog 条目(针对 CRON 过滤)

Nov  1 09:00:01 BIGBERTHA CRON[8998]: (rascal) CMD (/home/rascal/work/skunkworks/scripts/python/scrapers/funny_quotes.sh)
Nov  1 09:00:01 BIGBERTHA CRON[8999]: (rascal) CMD (/home/rascal/work/skunkworks/scripts/python/scrapers/even_funnier_quotes.sh)
Nov  1 09:00:01 BIGBERTHA CRON[9004]: (rascal) CMD (python /home/rascal/work/skunkworks/scripts/python/downloaders/make_whoopy.py)
Nov  1 09:09:01 BIGBERTHA CRON[9306]: (root) CMD (  [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Nov  1 09:09:01 BIGBERTHA CRON[9313]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -x /usr/lib/php5/sessionclean ] && [ -d /var/lib/php5 ] && /usr/lib/php5/sessionclean /var/lib/php5 $(/usr/lib/php5/maxlifetime))
Nov  1 09:17:01 BIGBERTHA CRON[9495]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

环境(在运行 cron 作业的服务器机器上)

rascal@BIGBERTHA:~/work/skunkworks/scripts/python/scrapers$ which python
/usr/bin/python
rascal@BIGBERTHA:~/work/skunkworks/scripts/python/scrapers$ which bash
/bin/bash
rascal@BIGBERTHA:~$ which scrapy
/usr/local/bin/scrapy

funny_quotes.sh

#!/bin/bash

. /home/rascal/.profile

cd /home/rascal/work/skunkworks/scripts/python/scrapers

scrapy crawl funny_quotes

在命令提示符下运行...

rascal@BIGBERTHA:~$ /home/rascal/work/skunkworks/scripts/python/scrapers/funny_quotes.sh 
2017-11-01 09:57:05 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapers)
2017-11-01 09:57:05 [scrapy.utils.log] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'scrapers.spiders', 'SPIDER_MODULES': ['scrapers.spiders'], 'BO
T_NAME': 'scrapers'}
2017-11-01 09:57:05 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.memusage.MemoryUsage',
 'scrapy.extensions.logstats.LogStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.corestats.CoreStats']
...

为什么作业通过 cron 以不同方式运行?

【问题讨论】:

  • 这是工作目录的问题吗?您在 python 脚本中使用相对路径还是绝对路径?我认为您可以使用find 来查找您的日志和数据。
  • 您是否尝试过在 cronjob 中执行错误并将日志输出到某个文件时重定向它们?
  • @Karthikeyan.R.S 是的,我尝试通过管道(重定向标准输出和错误)到日志文件 - 甚至没有创建文件。尝试使用 tee 相同的结果。
  • 您从哪个用户手动执行?是根还是流氓?
  • @Karthikeyan.R.S 检查系统日志输出,它是用户 rascal

标签: python bash shell cron scrapy


【解决方案1】:

事实证明,这与环境问题有关。 Cron 向 syslog 报告它已经运行了该作业,但没有创建任何文件/日志文件。

最终,我解决此问题的方法是将 MAILTO=username 添加到我的 crontab 中。完成此操作后,当作业运行并失败时,我看到了错误消息:

scrapy:找不到命令

然后我通过在我的 bash 脚本中添加以下语句来解决这个问题:

PATH=$PATH:/usr/local/bin/

【讨论】:

    【解决方案2】:

    您可以为您的 cron 创建自定义日志。

    0,30 8-18 * * 1-5 python /home/.../make_whoopy.py /home/make_whoopy.py.log 2>&1
    

    这会将 stderr 和 stdout 发送到 make_whoopy.py.log

    如果你想在屏幕上看到输出(肮脏的解决方案)

    0,30 8-18 * * 1-5 python /home/.../make_whoopy.py > /dev/pts/1
    

    当然,当您登录并且必须根据您的 tty 更改 /dev/pts/1 时,这将起作用

    另一种选择是发送到邮件

    0,30 8-18 * * 1-5 python /home/.../make_whoopy.py > /dev/null 2>&1 | mail -s "cron output" you@example.org
    

    蛋糕的关键是将输出发送到系统日志

    0,30 8-18 * * 1-5 python /home/.../make_whoopy.py | /usr/bin/logger -t make_whoopy
    

    -t make_whoopy 会在 syslog 上创建一个名为 make_whoopy 的标签。

    【讨论】:

      【解决方案3】:

      1) 据我所知,我们不做bash funny_quotes.sh 而不是funny_quotes.sh

      2)

      更改您的 cron 命令
      python /home/rascal/work/skunkworks/scripts/python/downloaders/make_whoopy.py
      

      cd /home/rascal/work/skunkworks/scripts/python/downloaders/ && python make_whoopy.py
      

      和这个一样

      /home/rascal/work/skunkworks/scripts/python/scrapers/funny_quotes.sh
      

      cd /home/rascal/work/skunkworks/scripts/python/scrapers/ && bash funny_quotes.sh
      

      3) 检查您的 cron 日志

      grep CRON /var/log/syslog
      

      我确定您会收到类似scrapy - command not found 或类似内容的错误。

      要修复它,请执行此操作

      输入并从 shell 复制 echo $PATH 的输出。

      然后打开crontab -e

      在文件的最顶部,写PATH=YOUR_COPIED_CONTENTS

      这应该可行。

      【讨论】:

      • 您建议的命令是我最初在我的 crontab 中使用的。我摆脱了链式命令(并使用管道/重定向/tee等管道输出到日志文件)。我当时存在的问题,我认为(错误地)简化命令(到单个命令)将解决问题。简而言之,我已经尝试了您的建议-我遇到了与此问题中报告的相同的问题。另外,我有 syslog 条目 - cron 肯定正在运行(没有报告错误),而且,你可以看到 scrapy 等在用户 rascal 的路径中。
      • 这样做有什么意义?我已经在正在运行的 shell 脚本中采购了我的整个环境。
      • @HomunculusReticulli 嘿,我仍然相信尝试我在第 3 点的建议......它只需要 5 分钟......也许它可以为你节省大量的调试时间:P
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      相关资源
      最近更新 更多