Я хочу использовать cron для ежечасного запуска программы python в Linux (ubuntu). Я написал скрипт под названием 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, используйте служебную программу service (8), например service cron start Поскольку сценарий, который вы пытаетесь вызвать, был преобразован в задание Upstart, вы также можете использовать утилиту start (8), например запустить 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")
Теперь я застрял в этой проблеме и прошу помощи.
Я не знаю, вся ли проблема в этом, но перенаправления вывода меняются. Скорее, чем:
command 2>&1 >> /path/to/output.log
(который перенаправляет stderr на stdout, а затем перенаправляет stdout, но не stderr к output.log
), тебе нужно:
command >> /path/to/output.log 2>&1
Как говорили другие, service cron start
команда не нужна; crond
уже должен быть запущен (как вы уже подтвердили, получив пустой файл журнала).
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)
файл.)
Пытаться sudo service cron start
.
*/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
каталог. Он также исправляет порядок операторов перенаправления; см. мой (Кейт Томпсон) ответ.