4

Я создал скрипт с именем forward_email.sh и установил права доступа на 777. Он содержит следующую строку:

echo "It worked: $(date)" >> /home/noc/email.log

Я создал задание cron со следующей строкой:

*/5 * * * * /home/noc/forward_email.sh

Проблема в том, что файл "email.log" никогда не изменяется. Я даже установил разрешения на 666. Когда я запускаю скрипт вручную, он работает отлично.

Задание cron выполняется в соответствии с файлом /var/log/cron.log.

Может ли кто-нибудь указать мне правильное направление относительно того, что может пойти не так? Это минимальная установка виртуальной машины Ubuntu Server 9.04 с установкой cron через apt-get.

ОБНОВЛЕНИЕ: я сделал очень глупую ошибку. Я назвал свой скрипт "forward_mail.sh". Я не сделал, пока не установил некоторые почтовые сервисы и не получил следующее сообщение об ошибке от Cron, в котором я обнаружил свою ошибку.

/bin/sh: /home/noc/forward_email.sh: not found

Я изменил имя файла, и теперь он работает.

4 ответа4

6

Много потенциальных вещей с моей головы.

Вы уверены, что запись в crontab действительно указывает на ваш скрипт? Например, если вы хотите запустить скрипт, такой как ~ noc/bin/script.sh, но иметь запись типа /home/noc/bin/script (т. Е. Неуловимая опечатка), то, конечно, он не будет работать. Я обычно проверяю свои записи в crontab, копируя команду из crontab с помощью мыши, а затем вставляя ее в командную строку, просто чтобы быть на 100% уверенным, что она будет работать так, как я хочу.

Ваш скрипт содержит только указанную строку? Обычно вы должны включить что-то вроде:

#!/bin/bash

... в верхней части вашего скрипта, чтобы заставить его работать.

Если это сложнее, чем одиночная строка, вы уверены, что логика программирования позволит ей запускать эту конкретную строку?

Попробуйте уменьшить ваш скрипт до

#!/bin/bash
echo "Bing!" >> /tmp/cronjob

... чтобы увидеть, что происходит. Если это работает, у вас есть проблема с программированием в вашем скрипте cron. Если это не удается, у вас есть проблема cron.

Является ли пользователь 'noc' сценарием? Если нет, то уверены ли вы, что пользователь, выполняющий скрипт cron, имеет доступ на чтение / запись через / home / noc к файлу email.log?

Куда отправляется сообщение об ошибке от пользователя, запустившего cronjob? Генерируется ли сообщение об ошибке, а затем отправляется куда-то, чего вы не ожидаете, или, возможно, его вообще сбрасывают? Попробуйте cronjob из

#!/bin/bash
echo "Bing!"

... а затем попытайтесь выяснить, куда отправляется электронная почта.

Cron.deny и / или cron.allow в игре? Если /etc/cron.allow существует, то в нем должен быть указан пользователь noc; если /etc/cron.deny существует. пользователь noc не должен быть указан в нем. В RedHat, если не существует ни cron.allow, ни cron.deny, ТОЛЬКО пользователь root может использовать cron.

5

Cron работает с ограниченными установленными переменными окружения, особенно с $PATH . Попробуйте поставить полный путь к любым двоичным файлам. Поэтому /home/noc/forward_email.sh должен быть:

/bin/echo "It worked: $(date)" >> /home/noc/email.log

Кроме того, что делает */5 в начале вашего скрипта? */5 запускается каждые пять минут, 5 запускается каждые 5 минут после часа каждый час.

5    *   *   *    * /home/noc/forward_email.sh
#*   *   *   *    *  command to be executed
#-   -   -   -    -
#|   |   |   |    |
#|   |   |   |    +----- day of week (0 - 6) (Sunday=0)
#|   |   |   +------- month (1 - 12)
#|   |   +--------- day of month (1 - 31)
#|   +----------- hour (0 - 23)
#+------------- min (0 - 59)

Наконец, вы отредактировали и сохранили crontab с помощью следующей команды:

crontab -e

... где ваш редактор выбран переменной среды $EDITOR?

1
echo "It worked: $(date)" >> /home/noc/email.log

Существует ли /home/noc/email.log до запуска сценария? Доступно ли для записи пользователю, выполняющему задание cron? Что произойдет, если вы создадите его заранее? например

touch /home/noc/email.log
chmod 666 /home/noc/email.log
0

Если у вас есть какие-либо сомнения относительно вашего сценария, поместите строку ниже в верхней части сценария:

 #!/bin/bash -x

(если вы не используете эту оболочку, просто установите хорошую)

Запуск подоболочки с параметром -x (e X plicit), который запускает весь сценарий в режиме отладки. Следы каждой команды плюс ее аргументы выводятся на стандартный вывод после расширения команд, но до их выполнения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .