Cronjob не работает скрипт

565
Jim

Я создал скрипт для получения своего внешнего IP-адреса, проверил, изменился ли он, и, если он есть, отправьте его мне по электронной почте, чтобы сообщить мне об этом.

Вот сценарий с удачным именем ip.sh(имя хоста сервера "odin"):

#!/bin/sh  # Start by renaming file "current-ip" to "old-ip" mv -f /var/www/html/scripts/current-ip /var/www/html/scripts/old-ip # Create new "current-ip" with the email's subject line echo 'Subject: Odin has a new IP address' >> /var/www/html/scripts/current-ip # Add a blank line echo '' >> /var/www/html/scripts/current-ip # Add some text to make the email slightly more readable echo 'It seems as if a new IP address as been assigned to Odin:' >> /var/www/html/scripts/current-ip # Get my external IP address and add it to a new line curl http://ipecho.net/plain -w "\n" >> /var/www/html/scripts/current-ip # Set permission to make the file readable and writeable chmod 766 /var/www/html/scripts/current-ip  # Check to see if the newly built "current-ip" matches the old file if diff /var/www/html/scripts/current-ip /var/www/html/scripts/old-ip >/dev/null ; then # if it does, do nothing exit # Otherwise send that email! else ssmtp -F"Odin" my_emial_address@gmail.com < /var/www/html/scripts/current-ip fi 

Чтобы проверить это, я иду отредактировать файл current-ip во что-то другое, а затем запускаю скрипт, ./ip.shи он работает как чудо, я получаю электронное письмо от «Odin», сообщающее мне, каков мой новый IP-адрес. Фантастика.

Итак, теперь я создаю символическую ссылку:

ln /var/www/html/scripts/ip.sh /sbin/odinip 

И проверить это, запустив odinip. Работает отлично.

Затем я создаю cronjob crontab -e и ввожу следующую строку:

*/5 * * * * /sbin/odinip 

Я также добавляю следующую строку, чтобы убедиться, что cron работает:

*/5 * * * * env > /var/www/html/scripts/env.output 

Затем я снова редактирую current-ipфайл, чтобы убедиться, что при запуске cronjob будет разница.

Тогда я жду и жду и жду. Файл env.output создан, но письма не отправляются.

Проверяя системный журнал ( tail -n25 /var/log/syslog) я получаю:

May 9 13:40:01 odin CRON[7371]: (root) CMD (env > /var/www/html/scripts/env.output) May 9 13:40:04 odin CRON[7341]: (CRON) info (No MTA installed, discarding output) May 9 13:40:38 odin crontab[7429]: (root) BEGIN EDIT (root) May 9 13:40:47 odin crontab[7429]: (root) END EDIT (root) May 9 13:40:49 odin crontab[7451]: (root) BEGIN EDIT (root) May 9 13:41:01 odin CRON[7478]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) May 9 13:41:16 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May 9 13:42:46 2016 [try http://www.rsyslog.com/e/2007 ] May 9 13:41:30 odin crontab[7451]: (root) END EDIT (root) May 9 13:41:31 odin crontab[7513]: (root) BEGIN EDIT (root) May 9 13:41:44 odin crontab[7513]: (root) END EDIT (root) May 9 13:41:46 odin crontab[7548]: (root) BEGIN EDIT (root) May 9 13:42:01 odin CRON[7587]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) May 9 13:42:46 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May 9 13:44:16 2016 [try http://www.rsyslog.com/e/2007 ] May 9 13:43:01 odin CRON[7690]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) May 9 13:43:41 odin crontab[7548]: (root) REPLACE (root) May 9 13:43:41 odin crontab[7548]: (root) END EDIT (root) May 9 13:44:01 odin cron[360]: (root) RELOAD (crontabs/root) May 9 13:44:01 odin CRON[7771]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) May 9 13:44:18 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May 9 13:45:48 2016 [try http://www.rsyslog.com/e/2007 ] May 9 13:45:01 odin CRON[7849]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) May 9 13:45:01 odin CRON[7850]: (root) CMD (/home/jim/duckdns/duck.sh >/dev/null 2>&1) May 9 13:45:01 odin CRON[7851]: (root) CMD (/sbin/odinip) May 9 13:45:04 odin CRON[7829]: (CRON) info (No MTA installed, discarding output) May 9 13:45:51 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May 9 13:47:21 2016 [try http://www.rsyslog.com/e/2007 ] May 9 13:46:01 odin CRON[7943]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) 

cpuTemp.shэто просто еще один скрипт, который у меня там работает. Может быть, что-то не так с агентом почтовой транспортировки? Но тогда как это работает, когда я запускаю его вручную?

Дополнительная информация: Все команды выполняются, файлы редактируются, а crontab редактируются как root. Все это происходит на Rasberry Pi 2, работающем под управлением Jessie. ОЧЕНЬ недавно обновлено и обновлено.

1
Давным-давно я унаследовал SuSE, чей cron не распознал, что его списки изменены, пока он не был перезапущен. Gombai Sándor 8 лет назад 0

2 ответа на вопрос

1
Jim

Ух ты. Ответ: используйте полные пути

Я думал, что сделал именно это, пока не обнаружил, что у кого-то еще возникла проблема с использованием ssmtp непосредственно из crontab.

Они имели:

0 9 * * * ssmtp a@hotmail.com < /home/a/a-msg.txt 

и пришлось изменить его на

0 9 * * * /usr/sbin/ssmtp a@hotmail.com < /home/a/a-msg.txt 

Что, видимо, решило проблему.

Я, с другой стороны, ссылался на ssmtp из скрипта bash ( ip.sh) с помощью строки:

ssmtp -F"Odin" my_emial_address@gmail.com < /var/www/html/scripts/current-ip 

Поэтому я обновил его до

/usr/sbin/ssmtp -F"Odin" my_emial_address@gmail.com < /var/www/html/scripts/current-ip 

Изменено содержимое current-ip для принудительного elseзапуска оператора if, и оно, похоже, работает. Я буду продолжать тестировать и обновлять это, если найду другие ошибки.

0
DOK

Cron не использует и не запоминает вашу среду при выполнении команд, поэтому пути и другие переменные среды могут не соответствовать вашим ожиданиям.

Как вы уже, наверное, поняли, лучший способ избежать проблем - всегда использовать полный путь к командам, которые вы выполняете из cron.