it-swarm-eu.dev

Jak přesměrovat výstup do souboru z cronu?

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.

120
RanRag

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.

173
RanRag

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.


Například

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.

Kde 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]

Zřeknutí se odpovědnosti

  • Tato odpověď předpokládá systém sysv
  • Informace systemd se mohou lišit
  • Konkrétně tyto informace byly získány pro centos-6 distro a nemusí platit pro různá sysv distros
    • Zmíním centos-6 konkrétně, protože různá distros mohou mít jinou implementaci crond, která se liší od centos-6
6