Mam skrypt kopii zapasowej, który muszę uruchomić o określonej porze dnia, więc używam cron
do 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 stdout
do pliku dziennika.
Powyższe zadanie cron wykonuje się dobrze syslog
i wykonuje zadanie wymienione w backup.sh
pliku, 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.
bash
io-redirection
cron
RanRag
źródło
źródło
Odpowiedzi:
Rozwiązałem problem. Istnieją dwa sposoby:
M1
Zmień przekierowanie z
&>>
na2>&1
. Więc terazcrontab -e
wyglądaUważam, że powyższe działa, ponieważ domyślnie
cron
jest używanesh
do uruchomienia zadania,bash
więc&>>
nie jest obsługiwane przezsh
.M2
Zmień domyślną powłokę, dodając
SHELL=/bin/bash
docrontab -e
pliku.źródło
cron
jest jaksh
: 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 systemush
, 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 cronSHELL=...
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.YYYY-MM-DD_hh-mm-sec
do nazwy pliku wyjściowego, aby każda nazwa pliku była inna i przechowywana bez przepisywania?*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.log
robi to samo.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/sh
twoje polecenie się nie powiedzie i twoje zadanie cron nigdy się nie uruchomi.Jeśli w
/etc/cron.d/example1
plikach konfiguracyjnych podasz użytkownika innego niżroot
i powłoka logowania tego użytkownika nie jest/bin/bash
... nadal musisz użyć składni / bin / sh w/etc/cron.d/example1
poleceniu.Na przykład
Jeśli użytkownik posiada powłokę
csh
lubzsh
lubksh
ustawić jego powłokę logowania. W/etc/cron.d/example1
pliku konfiguracyjnym polecenie musi używać/bin/sh
składni. W szczególności każde przekierowanie powłoki musi być/bin/sh
składniowe.Jeśli spróbujesz użyć na przykład
csh
składni przekierowania powłoki w swoim/etc/cron.d/example1
, wtedy twoje zadanie cron nigdy się nie uruchomi. Plik dziennikacrond
znajdujący się w at/var/log/cron
powinien powiedzieć, że polecenie zostało uruchomione, ale polecenie wykona błąd z błędem składni przed uruchomieniem polecenia.Gdzie
crond
emituje komunikaty o błędach dotyczących błędu składniowego?Błąd nigdy nie jest zgłaszany w
/var/log/cron
.crond
zamiast tego domyślnie emituje komunikaty o błędach przy użyciumail
. Musisz więc sprawdzić,/var/spool/mail/${USER}
jaki jest błąd.[1]
Zrzeczenie się
sysv
systemsystemd
informacje mogą się różnićcentos-6
dystrybucji i może nie mieć zastosowania do różnychsysv
dystrybucjicentos-6
konkretnie, ponieważ różne dystrybucje mogą mieć innącrond
implementację, która się różnicentos-6
źródło
/etc/cron.d/example1
polecenie używało innej powłoki, możesz użyć setSHELL=
w/etc/cron.d/example1
pliku konfiguracyjnym.