¿Cómo redirigir la salida a un archivo desde cron?

105

Tengo un script de respaldo que necesito ejecutar en un momento determinado del día, así que lo estoy usando cronpara esta tarea y desde dentro de cron también estoy tratando de redirigir la salida del script de respaldo a logfile.

crontab -e

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

En la entrada cron anterior, estoy redirigiendo ambos stderr and stdouta un archivo de registro.

El trabajo cron anterior se ejecuta bien syslog y realiza la tarea mencionada en el backup.sharchivo, pero no escribe nada en el archivo de registro.

/var/log/syslog

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

Cuando ejecuto el script desde cli, funciona según sea necesario y la salida se escribe en un archivo de registro

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:~$ 

Entonces, ¿por qué la salida del archivo no se redirige al archivo desde cron?

RanRag
fuente
superuser.com/questions/122246/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

158

Resolví el problema. Hay dos maneras:

M1

Cambie la redirección de &>>a 2>&1. Entonces ahora crontab -eparece

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

Creo que lo anterior funciona porque de forma predeterminada cronse usa shpara ejecutar la tarea en lugar de bashque &>>no sea compatible con sh.

M2

Cambie el shell predeterminado agregando SHELL=/bin/bashel crontab -earchivo.

RanRag
fuente
14
crones como sh: no selecciona un solo programa. Hay muchas implementaciones. La implementación más frecuente es Vixie cron. Soy el autor (actual, no el original) de otro. Creo que la mayoría de los demonios cron usarán los del sistema sh, pero eso puede variar si acepta &>>. Algunos demonios cron (como el mío) no le permiten cambiar qué shell ejecuta las líneas cron con SHELL=...líneas en el crontab. Me alegra que hayas encontrado una solución que funcione para ti; Simplemente pensé que valía la pena señalar que hay muchas variables que podrían afectar si funciona para otros.
dubiousjim
¿Cómo insertar YYYY-MM-DD_hh-mm-secen el nombre del archivo de salida, para que cada nombre de archivo sea diferente y se mantenga sin reescribir?
Danijel
1
@Danijel: Esto debería ayudar a serverfault.com/questions/117360/…
RanRag
2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.loghace lo mismo también
Yanick Girouard
5

descargo de responsabilidad [1].

Me gustaría agregar una nota al pie o un apéndice a la respuesta de @ RanRag .

Asegúrese de que su sintaxis de redirección de shell se ajuste a /bin/sh. Si intenta utilizar la sintaxis de redirección de shell que no es válida, /bin/shentonces su comando fallará y su trabajo cron nunca se ejecutará.

En sus /etc/cron.d/example1archivos de configuración, si especifica un usuario distinto de rooty el shell de inicio de sesión de ese usuario no es /bin/bash... aún debe usar la sintaxis / bin / sh en el /etc/cron.d/example1comando.


Por ejemplo

Si el usuario tiene la cáscara csho zsho kshfijado para su shell de entrada. En su /etc/cron.d/example1archivo de configuración, el comando debe usar la /bin/shsintaxis. Específicamente, cualquier redirección de shell debe ser /bin/shsintaxis.

Si intenta utilizar, por ejemplo, la cshsintaxis de redirección de shell en su /etc/cron.d/example1, entonces su trabajo cron nunca se ejecutará. El archivo de registro para crondubicado en /var/log/crondirá que el comando se ejecuta, pero el comando generará un error de sintaxis antes de que se ejecute el comando.

¿Dónde crondemite mensajes de error para un error de sintaxis?

El error nunca se informa en /var/log/cron. cronden su lugar, por defecto, emite cualquier mensaje de error usando mail. Por lo tanto, debe verificar /var/spool/mail/${USER}para ver cuál es el error.

[1]

Descargo de responsabilidad

  • Esta respuesta supone un sysvsistema
  • systemd la información puede diferir
  • Específicamente, esta información se aprendió para la centos-6distribución y puede no aplicarse a diferentes sysvdistribuciones
    • Menciono centos-6específicamente, porque diferentes distribuciones pueden tener una crondimplementación diferente que difiere decentos-6
Trevor Boyd Smith
fuente
2
si desea que su /etc/cron.d/example1comando use un shell diferente, puede usar set SHELL=en su /etc/cron.d/example1archivo de configuración.
Trevor Boyd Smith