таблица cron mailx вызвала пустой контент

1591
Daniel YC Lin

Я использую Centos 7.0 / 6.5. Содержание /etc/cron.hourly/mail.cron

#!/bin/sh log=/var/log/mail.cron.log echo "`hostname` `date`" >> $log 2>&1 mailx -s "test mail" me@example.com < $log 

Результат /var/log/mail.cron.log

myhost Mon Jul 28 11:01:01 CST 2014 

Но я получил пустое письмо с правильной темой. Итак, я тестирую этот cron вручную. Я получил правильный контент электронной почты.

myhost Mon Jul 28 11:01:01 CST 2014 myhost Mon Jul 28 11:30:29 CST 2014 

Вот связанный журнал / var / log / cron

Jul 28 11:01:01 myhost run-parts(/etc/cron.hourly)[24577]: starting mail.cron Jul 28 11:01:02 myhost run-parts(/etc/cron.hourly)[24605]: finished mail.cron 

Мне интересно, как отладить эту проблему.

1
Что выводит `crontab -l` ?. Также попробуйте изменить `echo" \ `имя хоста \` \ `date \` ">> $ log 2> & 1` на` echo "$ (дата имени хоста)" >> $ log`. jimm-cl 10 лет назад 0
@jim, 1. Нам не требуется `crontab -l` для проверки cron. Я уверен, что работа cron работает, я получил электронное письмо. Проблема в том, что содержимое письма пустое, оно должно содержать журнал. Мне не нужно менять `$ (дата имени хоста)`, это не проблема. Daniel YC Lin 10 лет назад 0

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

2
IAmJeff

A few things to try.

  1. !/bin/sh -xv

  2. Try redirecting stderr with two greater than signs, 2>>&1 .

The first will give you step-by-step output of your script. I'd try it first without redirecting stderr to your log file. Cron should mail you a copy of the output. You can see exactly where it goes wrong.

The second. Maybe you have an error that's clobbering your stdout? (Probably not, it works as you have it in CentOS 6.5.)

You could also check for unprintable characters using cat.

cat -vet /etc/cron.hourly/mail.cron 

Still another thing to try is to use absolute paths to your commands, /bin/echo instead of echo, /bin/date instead of date, /bin/hostname instead of hostname. (ymmv) Jim is absolutely correct in cron doesn't always use the exact environment as the same interactive user.

Если я запускаю /etc/cron.hourly/mail.cron прямо в корневой оболочке. Оно работает. Итак, я думаю, что проблема не вызвана перенаправлением. Daniel YC Lin 10 лет назад 1
Просто проверьте это на CentOS 6.5, это тоже проблема. Вы можете попробовать это. Daniel YC Lin 10 лет назад 0
Мой тест на CentOS 6.5 как root работал. Я использовал / var / tmp вместо / var / log, хотя. Вы пробовали с флагами -xv? Это напечатает команды и значения, которые скрипт использует во время работы. Я часто отлаживаю сценарии оболочки таким образом. IAmJeff 10 лет назад 0
1
jimm-cl

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

Измените свой скрипт на это:

#!/bin/sh source $HOME/.bash_profile # or whatever profile file or setting you are using log=/var/log/mail.cron.log echo "$(hostname) $(date)" >> $log mailx -s "test mail" me@example.com < $log 

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

Несколько полезных ссылок:

Я проверял. Это не работа. Даже включите $ HOME / .bash_profile. Daniel YC Lin 10 лет назад 0
0
Jinxmcg

I saw that you got some answers but not a clear working answer. What worked for me was to set the cron this way:

*/5 * * * * /fullpath/cron.sh | ( body="$(cat)"; if [[ -n $body ]]; then echo "$body" | mail -s "Cron script output" me@example.com; fi)

this captures the output and sends it to mail without it I get an empty email even when running in a script. (thanks to colucix)

Похожие вопросы