MAILTO="jnylund@***"
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /home/myapp/current/script/fetch_emails.sh
0 3 * * * /home/myapp/current/script/send_insurance_reminders.sh
Привет, первое задание запускается каждые 5 минут, другое, похоже, не запускается (нет файла журнала, нет ошибки электронной почты, ничего). Я должен делать что-то глупое ... есть идеи? Он отлично работает в командной строке.
Вот сценарий оболочки:
cd /home/myapp/current;rake send_insurance_reminders RAILS_ENV=production >> /home/myapp/current/log/insurance_reminders.log
Файл журнала не обновлялся с тех пор, как я последний раз запускал его вручную
Как насчет изменения строки cron на:
0 3 * * * /bin/bash /home/myapp/current/script/send_insurance_reminders.sh
Вы ведь ждете до трех утра, чтобы он запустился, верно?
Если да, то зависит ли это от переменной среды, установленной в вашей оболочке входа в систему?
Имеет ли сценарий оболочки необходимые разрешения на чтение и выполнение?
Cron проигнорирует запись без символа новой строки в конце - дважды проверьте, есть ли у вас новая строка (или две!) После последней записи.
Как вы редактировали файл crontab?
В зависимости от вашей реализации cron он может не получать изменения в файле crontab, если вы редактируете его напрямую. Если это так, либо отредактируйте файл crontab с помощью crontab -e
или сообщите процессу cron об изменениях (см. страницу руководства вашей реализации cron, чтобы узнать, как это сделать).
Однако многие современные реализации cron замечают изменения автоматически. Это может быть неправильное решение в вашем случае, но это возможность, и я еще не видел, чтобы об этом упоминалось.
Чтобы помочь с диагностикой, вы можете добавить logger
операторы в начало и конец вашего cron, чтобы сообщения отправлялись в syslog:
logger -t fetchmail Mail Fetch Started; /home/myapp/current/script/fetch_emails.sh && logger -t fetchmail Mail Fetch Completed
Причина, по которой вы хотите, чтобы перед финальным сообщением стояла «&&», заключается в том, что если ваш скрипт не выполнится, он никогда не отправит завершенное сообщение в syslog.
Лично мне нравится использовать теги ( -t
), чтобы упростить поиск системного журнала с помощью grep.
Вы прямо не сказали, что ваш сценарий работает. Предполагая, что это так, убедитесь, что cron работает от вашего имени. Если это не так, убедитесь, что у пользователя, запускающего cron, есть разрешения на выполнение сценария.
При устранении неполадок с crons мне также нравится обращаться к этому пользователю su (обычно используя su - username
) и выполнить скрипт вручную.