tabela cron mailx spowodowała pustą zawartość

1

Używam centos 7.0 / 6.5. Zawartość /etc/cron.hourly/mail.cron

#!/bin/sh
log=/var/log/mail.cron.log
echo "`hostname` `date`" >> $log 2>&1
mailx -s "test mail" [email protected] < $log

Wynik /var/log/mail.cron.log

myhost Mon Jul 28 11:01:01 CST 2014

Ale dostałem pusty e-mail z poprawnym tematem. Więc testuję ten cron ręcznie. Mam prawidłową treść e-maila.

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

Oto powiązany dziennik / 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

Zastanawiam się, jak rozwiązać ten problem.

Daniel YC Lin
źródło
Jaka jest wydajność crontab -l? Spróbuj także zmienić echo "`hostname` `date`" >> $log 2>&1na echo "$(hostname date)" >> $log.
jimm-cl
@jim, 1. Nie wymagamy crontab -lsprawdzania crona. Jestem pewien, że praca crona działa, dostałem e-mail. Problem polega na tym, że treść wiadomości e-mail jest pusta, powinna zawierać dziennik. Nie wymagam zmiany $(hostname date), to nie jest problem.
Daniel YC Lin

Odpowiedzi:

2

Kilka rzeczy do wypróbowania.

  1. ! / bin / sh -xv

  2. Spróbuj przekierować stderr z dwoma znakami większymi niż 2, 2 i 1.

Pierwszy daje krok po kroku wyjście ze skryptu. Najpierw spróbuję bez przekierowywania stderr do twojego pliku dziennika. Cron powinien przesłać ci kopię wyniku. Możesz dokładnie zobaczyć, gdzie idzie źle.

Drugi. Może masz błąd, który blokuje twoje standardowe wyjście? (Prawdopodobnie nie, działa tak, jak masz to w CentOS 6.5.)

Możesz także sprawdzić, czy nie ma drukowalnych znaków, używając cat.

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

Jeszcze inną rzeczą do wypróbowania jest użycie bezwzględnych ścieżek do poleceń, / bin / echo zamiast echo, / bin / date zamiast date, / bin / hostname zamiast nazwy hosta. (ymmv) Jim ma całkowitą rację, ponieważ cron nie zawsze używa dokładnego środowiska jako ten sam interaktywny użytkownik.

IAmJeff
źródło
1
Jeśli uruchomię /etc/cron.hourly/mail.cron bezpośrednio w powłoce root. To działa. Myślę więc, że problem nie jest spowodowany przekierowaniem.
Daniel YC Lin
Po prostu przetestuj to na CentOS 6.5, pojawia się również problem. Możesz spróbować.
Daniel YC Lin
Mój test na CentOS 6.5 jako root działał. Użyłem / var / tmp zamiast / var / log. Próbowałeś z flagami -xv? Spowoduje to wydrukowanie poleceń i wartości, których skrypt używa podczas działania. Często debuguję w ten sposób skrypty powłoki.
IAmJeff
1

Jesteś pewien, że cronzadanie działa zgodnie z Twoimi komentarzami - przetestowałeś je jednak ręcznie, gdy jesteś zalogowany. Chodzi o to, że uruchomione zadania cronnie biorą pod uwagę ustawień i zmiennych środowiskowych, które masz u bieżącego użytkownika, więc prawdopodobnie musisz .bash_profileprzesłać plik ustawień dla użytkownika jako krok przed wysłaniem wiadomości e-mail w skrypcie.

Zmień skrypt na ten:

#!/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" [email protected] < $log

cronnic nie wie o twojej powłoce - jest uruchamiany przez system, więc ma minimalne środowisko. Jeśli chcesz, aby mógł znajdować twoje programy lub uruchamiać narzędzia zainstalowane w twoim systemie, musisz dać znać, gdzie one są na pierwszym miejscu, i możesz to zrobić, ustawiając .profilezmienne na początku skryptu.

Kilka przydatnych linków:

jimm-cl
źródło
Testowałem. To nie jest praca. Dołącz nawet $ HOME / .bash_profile.
Daniel YC Lin
0

Widziałem, że masz kilka odpowiedzi, ale nie jest to jednoznaczna odpowiedź. Dla mnie zadziałało ustawienie crona w ten sposób:

* / 5 * * * * /fullpath/cron.sh | (body = "$ (cat)"; if [[-n $ body]]; następnie echo "$ body" | mail -s "Wyjście skryptu Crona" [email protected]; fi)

to przechwytuje dane wyjściowe i wysyła je do wiadomości e-mail bez niego. Otrzymuję pusty e-mail, nawet jeśli jest uruchomiony w skrypcie. (dzięki colucix)

Jinxmcg
źródło