Cómo solucionar todos los problemas / problemas relacionados con crontab (Linux)
Esta es una wiki comunitaria , si notas algo incorrecto con esta respuesta o tienes información adicional, edítala.
Primero, terminología básica:
- cron (8) es el demonio que ejecuta comandos programados.
- crontab (1) es el programa utilizado para modificar los archivos de usuario crontab (5).
- crontab (5) es un archivo por usuario que contiene instrucciones para cron (8).
A continuación, educación sobre cron:
Cada usuario en un sistema puede tener su propio archivo crontab. La ubicación de los archivos crontab raíz y de usuario depende del sistema, pero generalmente se encuentran a continuación /var/spool/cron
.
Hay un /etc/crontab
archivo de todo el sistema, el /etc/cron.d
directorio puede contener fragmentos de crontab que también son leídos y accionados por cron. Algunas distribuciones de Linux (por ejemplo, Red Hat) también tienen /etc/cron.{hourly,daily,weekly,monthly}
directorios, scripts dentro de los cuales se ejecutarán cada hora / día / semana / mes, con privilegios de root.
root siempre puede usar el comando crontab; Los usuarios habituales pueden o no tener acceso. Cuando edita el archivo crontab con el comando crontab -e
y lo guarda, crond verifica su validez básica pero no garantiza que su archivo crontab esté formado correctamente. Hay un archivo llamado cron.deny
que especificará qué usuarios no pueden usar cron. La cron.deny
ubicación del archivo depende del sistema y se puede eliminar, lo que permitirá a todos los usuarios usar cron.
Si la computadora no está encendida o el demonio crond no se está ejecutando, y la fecha / hora de ejecución de un comando ha pasado, crond no se pondrá al día y ejecutará consultas pasadas.
Crontab particulares, cómo formular un comando:
Un comando crontab está representado por una sola línea. No puede usar \
para extender un comando sobre varias líneas. El #
signo hash ( ) representa un comentario que significa que cualquier cosa en esa línea es ignorada por cron. Los espacios en blanco iniciales y las líneas en blanco se ignoran.
Sea MUY cuidadoso cuando use el %
signo de porcentaje ( ) en su comando. A menos que se \%
escapen, se convierten en nuevas líneas y todo después de que el primer no escapado %
se pase a su comando en stdin.
Hay dos formatos para los archivos crontab:
Crontabs de usuario
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
Sistema ancho /etc/crontab
y /etc/cron.d
fragmentos
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executed
Tenga en cuenta que este último requiere un nombre de usuario. El comando se ejecutará como el usuario nombrado.
Los primeros 5 campos de la línea representan los tiempos en que se debe ejecutar el comando. Puede usar números o, si corresponde, nombres de día / mes en la especificación de tiempo.
- Los campos están separados por espacios o pestañas.
- Se
,
utiliza una coma ( ) para especificar una lista, por ejemplo, 1,4,6,8, que significa ejecutar en 1,4,6,8.
- Los rangos se especifican con un guión (
-
) y se pueden combinar con listas, por ejemplo, 1-3,9-12, lo que significa entre 1 y 3 y luego entre 9 y 12.
- El
/
personaje se puede utilizar para introducir un paso, por ejemplo, 2/5, lo que significa comenzar en 2 y luego cada 5 (2,7,12,17,22 ...). No terminan más allá del final.
- Un asterisco (
*
) en un campo significa el rango completo para ese campo (por ejemplo, 0-59
para el campo de minutos).
- Los rangos y los pasos se pueden combinar, por ejemplo,
*/2
significa comenzar desde el mínimo para el campo relevante y luego cada 2, por ejemplo, 0 por minutos (0,2 ... 58), 1 por meses (1,3 ... 11), etc.
Depuración de comandos cron
¡Revisa el correo!
De forma predeterminada, cron enviará cualquier salida del comando al usuario que está ejecutando el comando como. Si no hay salida, no habrá correo. Si desea que cron envíe correo a una cuenta diferente, puede configurar la variable de entorno MAILTO en el archivo crontab, por ejemplo
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
Capture la salida usted mismo
Puede redirigir stdout y stderr a un archivo. La sintaxis exacta para capturar resultados puede variar según el shell que esté utilizando el cron. Aquí hay dos ejemplos que guardan todos los resultados en un archivo en /tmp/mycommand.log
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
Mira los troncos
Cron registra sus acciones a través de syslog, que (dependiendo de su configuración) a menudo van /var/log/cron
ao /var/log/syslog
.
Si es necesario, puede filtrar las declaraciones cron con, por ejemplo,
grep CRON /var/log/syslog
Ahora que hemos repasado los conceptos básicos de cron, dónde están los archivos y cómo usarlos, veamos algunos problemas comunes.
Comprueba que cron se está ejecutando
Si cron no se está ejecutando, sus comandos no se programarán ...
ps -ef | grep cron | grep -v grep
debería conseguirte algo como
root 1224 1 0 Nov16 ? 00:00:03 cron
o
root 2018 1 0 Nov14 ? 00:00:06 crond
Si no, reinícielo
/sbin/service cron start
o
/sbin/service crond start
Puede haber otros métodos; usa lo que tu distribución proporciona.
cron ejecuta su comando en un entorno restringido.
Es probable que las variables de entorno disponibles sean muy limitadas. Por lo general, sólo obtendrá un par de variables definidas, tales como $LOGNAME
, $HOME
, y $PATH
.
De particular interés es que PATH
está restringido a /bin:/usr/bin
. La gran mayoría de los problemas de "mi script cron no funciona" son causados por esta ruta restrictiva . Si su comando está en una ubicación diferente, puede resolver esto de dos maneras:
Proporcione la ruta completa a su comando.
1 2 * * * /path/to/your/command
Proporcione una RUTA adecuada en el archivo crontab
PATH=/usr:/usr/bin:/path/to/something/else
1 2 * * * command
Si su comando requiere otras variables de entorno, también puede definirlas en el archivo crontab.
cron ejecuta su comando con cwd == $ HOME
Independientemente de dónde resida el programa que ejecute en el sistema de archivos, el directorio de trabajo actual del programa cuando cron lo ejecute será el directorio de inicio del usuario . Si accede a los archivos en su programa, deberá tener esto en cuenta si usa rutas relativas, o (preferiblemente) solo usa rutas completamente calificadas en todas partes, y ahorrará a todos mucha confusión.
El último comando en mi crontab no se ejecuta
Cron generalmente requiere que los comandos se terminen con una nueva línea. Edite su crontab; vaya al final de la línea que contiene el último comando e inserte una nueva línea (presione Intro).
Comprueba el formato crontab
No puede usar un crontab con formato de usuario crontab para / etc / crontab o los fragmentos en /etc/cron.d y viceversa. Un crontab formateado por el usuario no incluye un nombre de usuario en la sexta posición de una fila, mientras que un crontab formateado del sistema incluye el nombre de usuario y ejecuta el comando como ese usuario.
Puse un archivo en /etc/cron.{hourly,daily,weekly,monthly} y no se ejecuta
- Verifique que el nombre del archivo no tenga una extensión vea run-parts
- Asegúrese de que el archivo tenga permisos de ejecución.
- Dígale al sistema qué usar cuando ejecute su secuencia de comandos (por ejemplo, poner
#!/bin/sh
en la parte superior)
Errores relacionados con la fecha Cron
Si un usuario o una actualización del sistema, una zona horaria u otra cambiaron su fecha recientemente, crontab comenzará a comportarse de manera errática y exhibirá errores extraños, a veces funcionando, a veces no. Este es el intento de crontab para tratar de "hacer lo que quieras" cuando el tiempo cambia desde abajo. El campo "minuto" se volverá ineficaz después de cambiar la hora. En este escenario, solo se aceptarían asteriscos. Reinicie cron e inténtelo de nuevo sin conectarse a Internet (para que la fecha no tenga la posibilidad de restablecerse en uno de los servidores horarios).
Signos de porcentaje, de nuevo
Para enfatizar el consejo sobre los signos de porcentaje, aquí hay un ejemplo de lo que cron hace con ellos:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
creará el archivo ~ / cron.out que contiene las 3 líneas
foo
bar
baz
Esto es particularmente intrusivo cuando se usa el date
comando. Asegúrese de escapar de los signos de porcentaje
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"