关于在 Linux 中使用 cron 来调度我的 Python 程序

关于在 Linux 中使用 cron 来调度我的 Python 程序

我想使用 cron 在 Linux(ubuntu) 中每小时运行一个 python 程序。我写了一个名为 script.sh 的脚本

cd Dropbox/NetworkProject/AMT_Crawler/
scrapy crawl AmtCrawler --set FEED_URI=data.json --set FEED_FORMAT=json

然后我用

crontab -e

并添加如下行

*/30 * * * * sh Dropbox/NetworkProject/AMT_Crawler/script.sh 2>&1 >> /Dropbox/NetworkProject/AMT_Crawler/output.log

在这之后,我跑

sudo /etc/init.d/cron start

在终端。它说

不要通过 /etc/init.d 调用 init 脚本,而是使用 service(8) 实用程序,例如 service cron start。由于您尝试调用的脚本已转换为 Upstart 作业,因此您也可以使用 start(8) 实用程序,例如 start cron

所以我运行这个

service cron start

然后就出现错误了:

start: Rejected send message, 1 matched rules; type="method_call", sender=":1.196" (uid=1000 pid=12574 comm="start cron ") interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")

现在我被这个问题困扰了,想寻求帮助。

答案1

cron(8)crontab(5)始终在运行。使用以下命令对文件进行更改时,无需启动或重新启动它crontab -e

   Additionally, cron checks each minute to see if its spool
   directory's modtime (or the modtime on /etc/crontab) has
   changed, and if it has, cron will then examine the modtime on
   all crontabs and reload those which have changed.  Thus cron
   need not be restarted whenever a crontab file is modified.
   Note that the crontab(1) command updates the modtime of the
   spool directory whenever it changes a crontab.

(最后一句话就是为什么总是建议crontab(1)在修改自己的crontab(5)文件时使用该程序的原因。)

答案2

我不知道这是否是整个问题,但是您的输出重定向被反转了。而不是:

command 2>&1 >> /path/to/output.log

(将 stderr 重定向到 stdout,然后重定向 stdout,但不是 stderroutput.log),您需要:

command >> /path/to/output.log 2>&1

正如其他人所说,该service cron start命令不是必需的;crond应该已经在运行(正如您已经通过获取空日志文件所确认的那样)。

答案3

尝试sudo service cron start

答案4

*/30 * * * * sh Dropbox/NetworkProject/AMT_Crawler/script.sh 2>&1 >> /Dropbox/NetworkProject/AMT_Crawler/output.log

您需要 Dropbox 目录的完整路径。它不在 / 下。

尝试这个(假设 Dropbox 目录是$HOME/Dropbox):

*/30 * * * * sh $HOME/Dropbox/NetworkProject/AMT_Crawler/script.sh >> $HOME/Dropbox/NetworkProject/AMT_Crawler/output.log 2>&1

请注意,这将改变两个都对目录的引用Dropbox。它还修复了重定向操作符的顺序;请参阅我的(Keith Thompson)的回答。

相关内容