【问题标题】:Directory: Is a directory目录:是一个目录
【发布时间】:2018-07-02 13:59:28
【问题描述】:

我已经设置了一个 cron 作业来运行 Python 脚本来抓取一些网页。

/etc/crontab

    GNU nano 2.3.1                                  File: crontab

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=my_email_address@domain.com

    # 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
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed

    */2 * * * * root /usr/bin scrapy crawl mycrawler

但是,电子邮件告诉我...

/bin/bash: /usr/bin: Is a directory

当我手动运行脚本时,它会将数据通过管道传输到我的数据库中,但是当 cron 作业执行脚本时,什么都没有……

/bin/bash: /usr/bin: Is a directory 消息暗示了什么?!

【问题讨论】:

  • */2 * * * * root /usr/bin scrapy crawl mycrawler 应该是 ` */2 * * * * root /usr/bin/python scrapy crawl mycrawler` ...或者只是` */2 * * * * root scrapy crawl mycrawler`
  • @MatthewStory 当我运行*/2 * * * * root scrapy crawl mycrawler 时,我开始收到说/bin/bash: scrapy: command not found 的电子邮件
  • 你的shell中which scrapy的输出是什么?
  • @MatthewStory /usr/local/bin/scrapy。但是,python 位于/usr/bin/python,这也是脚本的依赖项
  • 已发布答案...

标签: python linux cron cron-task


【解决方案1】:

正如 cmets 中所讨论的,最初的错误是条目将 /usr/bin 放置在可执行文件应位于的位置:

*/2 * * * * root /usr/bin scrapy crawl mycrawler
                 ^^^^^^^^
                 command

一旦固定为scapy,最终的问题是scrapy/usr/local/bin 中,而不是在你的PATH 中。要改变这一点:

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin/

然后你应该能够做到:

 */2 * * * * root cd <project dir> && scrapy crawl mycrawler

【讨论】:

  • 不会完全覆盖PATH 吗?我在你没有列出的路径中有其他东西。 PATH=$PATH:... 会不会更合适
  • 您的 crontab 中的 PATH 始终如一... cron 在运行之前取消设置所有环境变量。在这种情况下,我只是将 /usr/local/bin 附加到您在 OP 中发布的 crontab 中已经定义的路径定义中。
  • 所以它基本上是PATH 的“孤立”版本?这不会影响我存储在PATH 中的所有其他内容?
  • 是的,这只是 cron 中使用的路径......正如我所说......你已经在你的 crontab 中设置了它,我们只是将/usr/local/bin 添加到它。如果它让你感觉更好,你可以在前面加上$PATH,但它不会做任何事情,因为 cron 会取消设置环境。
  • 是的,对于 PATH 和 PYTHONPATH ...以及您通常假设的任何其他环境信息(例如,由您的 bashrc 加载的内容),因为 cron 不仅不会加载您的 rc 文件,它还会取消设置所有环境变量。
【解决方案2】:
/usr/bin

在类 Unix 操作系统上是一个相当标准的目录,其中包含大部分可执行文件。

即您正在尝试让 cron 使用作为目录的可执行文件执行“scrapy crawl mycrawler”。

您通常必须执行 bash 脚本(假设 bash 二进制文件位于 /usr/bin 目录中):

*/2 * * * * root /usr/bin/bash scrapy.sh

或者一个 python 命令(再次假设 python 二进制文件在 /usr/bin 目录中)

*/2 * * * * root /usr/bin/python scrapy.py

或者你可以将scrapy绝对路径添加到你的PATH变量中:

*/2 * * * * root scrapy crawl mycrawler

【讨论】:

  • 这很有趣,因为在我的另一个问题上,我刚刚被告知我的代码会很好:/ 我可以在不创建和引用 shell 脚本的情况下做到这一点
  • 当然可以不创建和引用 shell 脚本...我的意思是,scrapy crawl mycrawler 是一个 shell 命令...
  • 您可以在不创建 shell 脚本的情况下执行此操作。需要引用 Python 二进制文件,即 /usr/bin/python script.py(其中 script.py 是 python 脚本),或者 python 需要成为路径的一部分。该路径是您的系统将连续查找二进制文件以执行命令的位置。
  • 我相信我需要通过发出命令scrapy crawl mycrawler来执行脚本
  • 好的,然后你需要将 scrapy 添加到你的 PATH 变量中。我假设scrapy是二进制的?
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 2015-07-17
  • 2014-12-19
  • 1970-01-01
相关资源
最近更新 更多