Por defecto, una entrada en cron de nuestro servidor Unix/Linux envía por email la salida que genera el comando ejecutado.
Para tener más control y evitar problemas adicionales que podrían estar relacionados con el propio servicio de correo, podemos redirigir la salida a un fichero y añadirle la hora de ejecución.
Por ejemplo, una entrada normal de crontab para que un comando ‘comando_a_ejecutar’ se ejecute todos los días a las 08:05 sería:
5 8 * * * comando_a_ejecutar
En su lugar, podemos escribir la entrada de la siguiente forma:
5 8 * * * (date; comando_a_ejecutar) >> /tmp/crontab_output.log 2>&1 &
como vemos, añadimos un comando ‘date’ precediendo al comando que queremos ejecutar, y ponemos ambos entre paréntesis, para que se ejecuten dentro de un subshell.
A continuación, con “>> /tmp/crontab_output.log” indicamos que la salida que generen dichos comandos por standard output se guarde en el fichero /tmp/crontab_output.log.
Después, con “2>&1” estamos indicando que la salida que generen los comandos por standard error (file descriptor 2) sea enviada a standard output (file descriptor 1). Por lo tanto, también la salida por standard error será escrita en el fichero /tmp/crontab_output.log.
Por último, con el carácter ‘&‘ indicamos que los comandos se deben ejecutar en un subproceso. Esta es una medida adicional para asegurar que, aunque el tiempo de ejecución de nuestro proceso sea grande, no impida la ejecución de otras entradas del crontab.
Nota: Si ejecutamos el comando ‘date’ en nuestro servidor, obtenemos la hora en la zona horaria configurada por defecto para nuestro usuario, pero cuando añadimos o editamos una entrada en el crontab, debemos especificar la hora UTC.
Ejemplo:
openalfa@openalfa:~$ date Sun Apr 15 16:25:25 CEST 2012 openalfa@openalfa:~$ date -u Sun Apr 15 14:25:29 UTC 2012 openalfa@openalfa:~$
Como vemos, nuestro servidor indica que son las 16:25 CEST (Central European con daylight Saving Time), pero si añadimos el modificador “-u”, vemos que son las 14:25 UTC, es decir, que hay dos horas de diferencia. Así que el comando del ejemplo que hemos utilizado más arriba se ejecutará cada día a las 08:05 UTC, que son las 10:05 hora local.