Mám záložní skript, který musím běžet v konkrétní denní dobu, takže pro tuto úlohu používám cron
a v rámci cron se také snažím přesměrovat výstup záložního skriptu na logfile
.
crontab -e
*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log
Ve výše uvedeném záznamu cron přesměrovávám oba stderr and stdout
do souboru protokolu.
Výše uvedená úloha cron se provádí dobře podle syslog
a provádí úlohu uvedenou v backup.sh
soubor, ale do souboru protokolu nic nezapisuje.
/var/log/syslog
Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)
Když spustím skript z cli, pracuje podle potřeby a výstup je zapsán do souboru protokolu
[email protected]:~$ ./backup.sh &>> backup.log
[email protected]:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
[email protected]:~$
Proč tedy výstup souboru není přesměrován do souboru z cronu.
Problém jsem vyřešil. Existují dva způsoby:
M1
Změnit přesměrování z &>>
to 2>&1
. Tak teď crontab -e
vypadá jako
*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1
Věřím výše uvedené funguje, protože ve výchozím nastavení cron
používá sh
ke spuštění úlohy namísto bash
so &>>
není podporován sh
.
M2
Změňte výchozí Shell přidáním Shell=/bin/bash
v crontab -e
soubor.
vyloučení odpovědnosti [1].
Chtěl bych přidat poznámku pod čarou nebo dodatek k @ RanRagova odpověď .
Ujistěte se, že vaše syntaxe přesměrování Shell odpovídá /bin/sh
. Pokud se pokusíte použít syntaxi přesměrování Shell, která není platná s /bin/sh
pak váš příkaz selže a vaše cron úloha se nikdy nespustí.
Ve vašem /etc/cron.d/example1
config files Pokud zadáte jiného uživatele než root
a přihlašovací jméno uživatele Shell není /bin/bash
... musíte stále používat syntaxi/bin/sh v /etc/cron.d/example1
příkaz.
Pokud má váš uživatel Shell pro své přihlašovací prostředí Shell nastaven csh
nebo zsh
nebo ksh
. Ve vašem /etc/cron.d/example1
config file, příkaz musí použít /bin/sh
syntaxe. Konkrétně jakékoli přesměrování Shell musí být /bin/sh
syntaxe.
Pokud se pokusíte použít například csh
Shell přesměrovává syntaxi ve vašem /etc/cron.d/example1
, pak se vaše úloha cronu nikdy nespustí. Logfile pro crond
umístěný na /var/log/cron
řekne, že příkaz je spuštěn, ale před spuštěním příkazu dojde k chybě syntaktické chyby.
crond
vydává chybové zprávy pro chybu syntaxe?Chyba není nikdy hlášena v /var/log/cron
. crond
místo toho ve výchozím nastavení vysílá jakékoli chybové zprávy pomocí mail
. Musíte tedy zkontrolovat /var/spool/mail/${USER}
vidět, co je chyba.
[1]
sysv
systemd
se mohou lišitcentos-6
distro a nemusí platit pro různá sysv
distros centos-6
konkrétně, protože různá distros mohou mít jinou implementaci crond
, která se liší od centos-6