Jak przekierować wyjście do pliku z poziomu crona?

105

Mam skrypt kopii zapasowej, który muszę uruchomić o określonej porze dnia, więc używam crondo tego zadania i z poziomu crona próbuję również przekierować wyjście skryptu kopii zapasowej do logfile.

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

W powyższym wpisie cron przekierowuję oba stderr and stdoutdo pliku dziennika.

Powyższe zadanie cron wykonuje się dobrze syslog i wykonuje zadanie wymienione w backup.shpliku, ale nie zapisuje niczego w pliku dziennika.

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

Kiedy uruchamiam skrypt z cli, działa on zgodnie z wymaganiami, a dane wyjściowe są zapisywane w pliku dziennika

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

Dlaczego dane wyjściowe pliku nie są przekierowywane do pliku z poziomu crona.

RanRag
źródło
superuser.com/questions/122246/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

158

Rozwiązałem problem. Istnieją dwa sposoby:

M1

Zmień przekierowanie z &>>na 2>&1. Więc teraz crontab -ewygląda

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

Uważam, że powyższe działa, ponieważ domyślnie cronjest używane shdo uruchomienia zadania, bashwięc &>>nie jest obsługiwane przez sh.

M2

Zmień domyślną powłokę, dodając SHELL=/bin/bashdo crontab -epliku.

RanRag
źródło
14
cronjest jak sh: nie wybiera żadnego programu. Istnieje wiele implementacji. Najbardziej rozpowszechnioną implementacją jest Vixie cron. Jestem (obecnym, nie oryginalnym) autorem innej osoby. Wierzę, że większość demonów cron będzie korzystać z systemu sh, ale to może różnić się w zależności od tego, czy akceptuje &>>. Niektóre demony cron (jak moje) nie pozwalają ci zmienić, która powłoka wykonuje linie cron SHELL=...liniami w crontab. Cieszę się, że znalazłeś rozwiązanie, które Ci odpowiada; Pomyślałem, że warto wskazać, że istnieje wiele zmiennych, które mogą mieć wpływ na to, czy działa dla innych.
dubiousjim,
Jak wstawić YYYY-MM-DD_hh-mm-secdo nazwy pliku wyjściowego, aby każda nazwa pliku była inna i przechowywana bez przepisywania?
Danijel
1
@Danijel: To powinno pomóc serverfault.com/questions/117360/…
RanRag
2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logrobi to samo.
Yanick Girouard,
5

zrzeczenie się odpowiedzialności [1].

Chciałbym dodać przypis lub uzupełnienie do odpowiedzi @ RanRag .

Upewnij się, że składnia przekierowania powłoki jest zgodna /bin/sh. Jeśli spróbujesz użyć niepoprawnej składni przekierowania powłoki, /bin/shtwoje polecenie się nie powiedzie i twoje zadanie cron nigdy się nie uruchomi.

Jeśli w /etc/cron.d/example1plikach konfiguracyjnych podasz użytkownika innego niż rooti powłoka logowania tego użytkownika nie jest /bin/bash... nadal musisz użyć składni / bin / sh w /etc/cron.d/example1poleceniu.


Na przykład

Jeśli użytkownik posiada powłokę cshlub zshlub kshustawić jego powłokę logowania. W /etc/cron.d/example1pliku konfiguracyjnym polecenie musi używać /bin/shskładni. W szczególności każde przekierowanie powłoki musi być /bin/shskładniowe.

Jeśli spróbujesz użyć na przykład cshskładni przekierowania powłoki w swoim /etc/cron.d/example1, wtedy twoje zadanie cron nigdy się nie uruchomi. Plik dziennika crondznajdujący się w at /var/log/cronpowinien powiedzieć, że polecenie zostało uruchomione, ale polecenie wykona błąd z błędem składni przed uruchomieniem polecenia.

Gdzie crondemituje komunikaty o błędach dotyczących błędu składniowego?

Błąd nigdy nie jest zgłaszany w /var/log/cron. crondzamiast tego domyślnie emituje komunikaty o błędach przy użyciu mail. Musisz więc sprawdzić, /var/spool/mail/${USER}jaki jest błąd.

[1]

Zrzeczenie się

  • Ta odpowiedź zakłada sysvsystem
  • systemd informacje mogą się różnić
  • W szczególności ta informacja została wyciągnięta z centos-6dystrybucji i może nie mieć zastosowania do różnych sysvdystrybucji
    • Wspominam centos-6konkretnie, ponieważ różne dystrybucje mogą mieć inną crondimplementację, która się różnicentos-6
Trevor Boyd Smith
źródło
2
jeśli chcesz, aby twoje /etc/cron.d/example1polecenie używało innej powłoki, możesz użyć set SHELL=w /etc/cron.d/example1pliku konfiguracyjnym.
Trevor Boyd Smith