我想使用 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,但不是 stderr至output.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)的回答。