Tengo un script de respaldo que necesito ejecutar en un momento determinado del día, así que lo estoy usando cron
para 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 stdout
a un archivo de registro.
El trabajo cron anterior se ejecuta bien syslog
y realiza la tarea mencionada en el backup.sh
archivo, 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?
bash
io-redirection
cron
RanRag
fuente
fuente
Respuestas:
Resolví el problema. Hay dos maneras:
M1
Cambie la redirección de
&>>
a2>&1
. Entonces ahoracrontab -e
pareceCreo que lo anterior funciona porque de forma predeterminada
cron
se usash
para ejecutar la tarea en lugar debash
que&>>
no sea compatible consh
.M2
Cambie el shell predeterminado agregando
SHELL=/bin/bash
elcrontab -e
archivo.fuente
cron
es comosh
: 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 sistemash
, pero eso puede variar si acepta&>>
. Algunos demonios cron (como el mío) no le permiten cambiar qué shell ejecuta las líneas cron conSHELL=...
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.YYYY-MM-DD_hh-mm-sec
en el nombre del archivo de salida, para que cada nombre de archivo sea diferente y se mantenga sin reescribir?*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.log
hace lo mismo tambiéndescargo 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/sh
entonces su comando fallará y su trabajo cron nunca se ejecutará.En sus
/etc/cron.d/example1
archivos de configuración, si especifica un usuario distinto deroot
y 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/example1
comando.Por ejemplo
Si el usuario tiene la cáscara
csh
ozsh
oksh
fijado para su shell de entrada. En su/etc/cron.d/example1
archivo de configuración, el comando debe usar la/bin/sh
sintaxis. Específicamente, cualquier redirección de shell debe ser/bin/sh
sintaxis.Si intenta utilizar, por ejemplo, la
csh
sintaxis de redirección de shell en su/etc/cron.d/example1
, entonces su trabajo cron nunca se ejecutará. El archivo de registro paracrond
ubicado en/var/log/cron
dirá que el comando se ejecuta, pero el comando generará un error de sintaxis antes de que se ejecute el comando.¿Dónde
crond
emite mensajes de error para un error de sintaxis?El error nunca se informa en
/var/log/cron
.crond
en su lugar, por defecto, emite cualquier mensaje de error usandomail
. Por lo tanto, debe verificar/var/spool/mail/${USER}
para ver cuál es el error.[1]
Descargo de responsabilidad
sysv
sistemasystemd
la información puede diferircentos-6
distribución y puede no aplicarse a diferentessysv
distribucionescentos-6
específicamente, porque diferentes distribuciones pueden tener unacrond
implementación diferente que difiere decentos-6
fuente
/etc/cron.d/example1
comando use un shell diferente, puede usar setSHELL=
en su/etc/cron.d/example1
archivo de configuración.