Почему мой crontab не выполняет bash правильно? - PullRequest
0 голосов
/ 10 апреля 2020

Я полный нуб к Linux и использую Raspbian на Raspberry Pi 4. Я создал скрипт bash, который обновляет файл HTML и запускает некоторые программы python, чтобы чирикать случайную статью из Википедии Список необычных статей. Это сценарий bash, который я запускаю:

#! /bin/bash
wget -q en.wikipedia.org/wiki/Wikipedia:Unusual_articles -O Wikipedia:Unusual_articles
python3 parser.py
python3 tweeter.py

В моем crontab у меня есть команда для запуска сценария bash каждый день в 12 часов:

0 12 * * * /home/pi/Code/Python/TwitterBots/UArticleBot/TweetRandom.sh

Когда я запускаю скрипт вручную с bash, он работает просто отлично, но я не понимаю, почему мой cron не работает. Даже когда я установил MAILTO=my@email.com, он ничего не отправляет мне по электронной почте.

РЕДАКТИРОВАТЬ: Я запустил echo $PATH и добавил то, что было выведено в мой cron. Вот как сейчас выглядит cron (у меня он запускается каждые 2 минуты для целей отладки):

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
MAILTO=my@email.com
*/2 * * * * bash /home/pi/Code/Python/TwitterBots/UArticleBot/TweetRandom.sh

И вот как теперь выглядит скрипт bash:

#! /bin/bash
wget -q en.wikipedia.org/wiki/Wikipedia:Unusual_articles -O Wikipedia:Unusual_articles
python3 parser.py
python3 tweeter.py

1 Ответ

1 голос
/ 11 апреля 2020

Задания cron выполняются с домашним каталогом пользователя в качестве рабочего каталога. Это означает, что все ссылки на файлы, которые не указывают явный путь (или используют поиск через что-то вроде $PATH), будут находиться в вашем домашнем каталоге.

Указание пути к сценарию не меняет его при все. Я подозреваю, что когда вы тестируете скрипт в интерактивном режиме, вы делаете что-то вроде этого:

cd /home/pi/Code/Python/TwitterBots/UArticleBot
./TweetRandom.sh

Попробуйте сделать это вместо этого и посмотрите, что он делает:

cd ~
/home/pi/Code/Python/TwitterBots/UArticleBot/TweetRandom.sh

Я думаю, это будет сделать то же самое, что и при запуске из задания cron: создайте файл Wikipedia:Unusual_articles в вашем домашнем каталоге, а затем получите ошибки, потому что он не может найти ни сценарий parser.py, ни tweeter.py.

Одним из способов решения этой проблемы является использование явных путей для всего (что, вероятно, также потребует изменения сценариев python, поскольку они, вероятно, предполагают, что файл Wikipedia находится в текущем каталоге).

Другой вариант - поместить ваш скрипт cd в свой каталог, прежде чем делать что-либо еще. В общем, это может быть немного сложно (см. BashFAQ # 28 ), но это должно работать для вашего случая:

#!/bin/bash
cd "$(dirname "$BASH_SOURCE")" || {
    echo "Error cd'ing to script directory" >&2
    exit 1
}
... rest of script here

Кстати, при поиске и устранении неполадок заданий cron, это невероятно полезно для захвата ошибки и другая информация, которую они печатают во время работы. Cron пытается позаботиться об этом за вас, но это не всегда работает хорошо. Вы можете направить вывод в файл журнала, добавив перенаправление в конец записи cron:

0 12 * * * /home/pi/Code/Python/TwitterBots/UArticleBot/TweetRandom.sh >>/tmp/tweetjob.log 2>&1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...