我正在尝试使用 crontab 以编程方式在我的服务器上运行一些 scrapy 蜘蛛。我尝试了几个命令,但最终这个 crontab 并未运行,也没有给出任何有用的错误。
#!/bin/bash
PATH=/root/
47 9,22 * * * cd Travel/lastsecond && scrapy crawl tours
这个 crontab 不起作用,syslog
我得到了这个:
Feb 13 09:47:01 d4bd CRON[18641]: (root) CMD (cd Travel/lastsecond && scrapy crawl tours)
Feb 13 09:47:01 d4bd CRON[18640]: (CRON) info (No MTA installed, discarding output)
在输出中,我得到了这个:
/bin/sh: 1: scrapy: not found
我已经安装了 scrapy 并且命令可以独立正常运行。
答案1
Cron 默认向用户发送一封邮件,其中包含它运行的命令的输出。但是,正如它所说,没有安装 MAT(邮件传输代理),因此 cron 无法发送邮件并丢弃命令输出。您可以自己将输出重定向到文件或空白处(/dev/null),方法是将 cron 行更改为:
47 9,22 * * * cd Travel/lastsecond && scrapy crawl tours > outfile 2>&1
或者
47 9,22 * * * cd Travel/lastsecond && scrapy crawl tours > /dev/null 2>&1
第二种可能性是安装 MTA(sendmail、postfix 或类似的)——并将其配置为处理本地邮件。
或者您可以确保您的脚本不会产生任何输出。
答案2
scrapy
无法在任何地方找到该文件PATH
(见下文)。要查找其位置,请在交互式 shell 中使用以下命令:
which scrapy
它将显示其绝对路径,例如/usr/local/bin/scrapy
。将绝对路径放入 crontab:
47 9,22 * * * cd Travel/lastsecond && /usr/local/bin/scrapy crawl tours
关于PATH
变量
这PATH
当您未在命令行或脚本中指定确切路径时,将使用变量来搜索程序。它由配置文件设置和 crontabs 定义。它通常看起来像:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
该示例来自我的/etc/crontab
。但是,您在 crontab 中提供的值看起来不寻常……
PATH=/root/
你不是想设定工作目录这里?!
关于shebang
舍邦是许多脚本的第一行。它指定哪个解释器将解释该文件。它在 crontab 中毫无意义,您应该将其删除。Crontab 是一个数据Cron 文件,而不是脚本。