Отправка почты из скрипта, который запускается Crontab

#!/BIN/BASH # To alert whenever lsof crosses 80% maxlimit=32000 echo 'Max limit is ' $maxlimit tlimit=$(bc <<< $maxlimit*0.8) echo 'Treshold limit at 80% ' $tlimit a=$(lsof | wc -l) echo 'Current usage ' $a if [ $(bc <<< "$a > $tlimit") -eq 1 ] then echo 'lsof =' $a 'has exceeded 80% of maximum limit' | /usr/bin/Mail -s "ALERT!!!" "*****@cisco.com" fi 

 * * * * * bash /root/vasanth/lsef/script.sh 

В приведенном выше сценарии выход должен отправить почту на соответствующий идентификатор почты.

Когда я запускаю его вручную, он отправляет почту.

Но, когда это запланировано в cron, почта не отправляется.

Я не могу понять, в чем проблема. Как я мог его отладить?

Основная проблема с подобными задачами cron заключается в том, что вы не можете легко их отладить.

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

Расширяя ответ EgorVasilev, вы можете легко включить «режим отладки» в сценарии сценария bash

 #!/bin/bash -x exec 2>>/var/log/cron.log 

команды. Первый интерпретирует ваш скрипт с помощью флага -x , что означает, что вы получите всю выполненную команду в stderr.

И exec 2>>/var/log/cron.log – это команда, которая ничего не выполняет , а перенаправляет ошибку stdandard в файл журнала в режиме добавления. По сути, интерпретатор оболочки «повторно выполняет» себя с заданными переадресациями, даже не изменяя контекст выполнения скрипта .

1. Сначала: используйте #!/bin/bash вместо #!/BIN/BASH

С #!/BIN/BASH если вы запускаете скрипт следующим образом:

 bash script.sh 

.. все хорошо работает.

Но если вы выполните:

 ./script.sh 

.. вы получите сообщение об ошибке:

 -bash: ./script.sh: /BIN/BASH: bad interpreter: No such file or directory 

2. Выполните следующую команду:

 echo 'PATH='$PATH 

добавьте вывод в начало скрипта.

Пример :

 # echo 'PATH='$PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin