Назад | Перейти на главную страницу

Об использовании cron в Linux для планирования моей программы на Python

Я хочу использовать 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 каталог. Он также исправляет порядок операторов перенаправления; см. мой (Кейт Томпсон) ответ.