Esto es un Pregunta canónica sobre el uso de cron y crontab.
La respuesta para ' ¿Por qué no funciona mi cronómetro y cómo puedo solucionarlo? se puede ver abajo. Esto se refiere a la cron
con el crontab resaltado.
Esto es un Pregunta canónica sobre el uso de cron y crontab.
La respuesta para ' ¿Por qué no funciona mi cronómetro y cómo puedo solucionarlo? se puede ver abajo. Esto se refiere a la cron
con el crontab resaltado.
**Si notas algo incorrecto en esta respuesta o tienes información adicional, entonces por favor edítala. **
Cada usuario en un sistema puede tener su propio archivo crontab. La ubicación de los archivos crontab de root y del usuario dependen del sistema, pero generalmente están por debajo de /var/spool/cron
.
Hay un sistema de /etc/crontab
el archivo, el /etc/cron.d
El 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}
que son directorios, scripts dentro de los cuales se ejecutarán cada hora/día/semana/mes, con privilegios de root.
root siempre puede utilizar el comando crontab; a los usuarios habituales se les puede conceder o no acceso. Cuando se edita el archivo crontab con el comando crontab -e
y lo guarda, crond comprueba su validez básica pero no garantiza que su archivo crontab esté correctamente formado. Hay un archivo llamado cron.deny
que especificará qué usuarios no pueden utilizar el cron. El cron.deny
La ubicación del archivo depende del sistema y puede ser borrado, lo que permitirá a todos los usuarios utilizar el cron.
Si la computadora no está encendida o el demonio crond no se está ejecutando, y ha pasado la fecha/hora de ejecución de un comando, crond no se pondrá al día y ejecutará las consultas anteriores.
Un comando del crontab está representado por una sola línea. No se puede usar \
para extender un comando a través de múltiples líneas. El hash ( #
) representa un comentario que significa que cualquier cosa en esa línea es ignorada por cron. Los espacios en blanco y las líneas en blanco son ignorados.
Tenga MUY cuidado al usar el porcentaje ( %
) Firme su orden. A menos que se escapen \%
se convierten en nuevas líneas y todo después de la primera no-escapada %
se pasa a su comando en stdin.
Hay dos formatos para los archivos crontab:
Los cronistas de los usuarios
# 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
En todo el sistema /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
Fíjese que este último requiere un nombre de usuario. El comando se ejecutará con el nombre de usuario.
Los primeros 5 campos de la línea representan el momento o momentos en que el comando debe ser ejecutado. Puede utilizar números o, en su caso, nombres de día/mes en la especificación de tiempo.
,
) se utiliza para especificar una lista, por ejemplo, 1,4,6,8, lo que significa que se ejecuta en 1,4,6,8.-
) y puede combinarse con las listas, por ejemplo, 1-3,9-12 que significa entre 1 y 3 y luego entre 9 y 12./
se puede usar para introducir un paso, por ejemplo 2/5, lo que significa empezar en 2 y luego cada 5 (2,7,12,17,22...). No pasan del final.*
) en un campo significa el penúltimo (por ejemplo, 0-59) para el campo de los minutos, etc.).*/5
significa que empieza en 0 y luego cada 5.¡Revisa el correo! Por defecto, cron enviará por correo cualquier salida del comando al usuario que está ejecutando el comando como. Si no hay salida no habrá correo. Si quiere que cron envíe el correo a una cuenta diferente, entonces puede establecer la variable de entorno MAILTO en el archivo crontab, por ejemplo.
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
Captura la salida tú mismo
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
que captura stdout y stderr a /tmp/mycommand.log
Mira los registros; cron registra sus acciones a través del syslog, que (dependiendo de tu configuración) a menudo va a /var/log/cron
o /var/log/syslog
.
Si es necesario, puede filtrar las declaraciones de cron con, por ejemplo.
grep CRON /var/log/syslog
Ahora que hemos repasado los fundamentos de cron, dónde están los archivos y cómo usarlos, veamos algunos problemas comunes.
Si cron no se está ejecutando entonces sus comandos no serán programados ...
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 lo reinicia
/sbin/service cron start
o
/sbin/service crond start
Puede haber otros métodos; utilice lo que le proporcione su distro.
La mayoría de las preguntas de cron que vemos están relacionadas con esto. En particular la PATH
se limita a /bin:/usr/bin
. Si su comando está en un lugar diferente puede resolver esto de un par de maneras
Proporcione el camino completo a su comando.
1 2 * * * /path/to/your/command
Proporcionar un PATH adecuado en el archivo crontab
PATH=/usr:/usr/bin:/path/to/your
1 2 * * * command
Si su comando requiere otras variables de entorno, también puede definirlas en el archivo crontab.
Cron generalmente requiere que los comandos se terminen con una nueva línea. Edita tu crontab; ve al final de la línea que contiene el último comando e inserta una nueva línea (presiona enter).
No se puede usar un crontab de usuario formateado para /etc/crontab o los fragmentos en /etc/cron.d y viceversa. Un crontab con formato de usuario no incluye un nombre de usuario en la 6ª posición de una fila, mientras que un crontab con formato de sistema incluye el nombre de usuario y ejecuta el comando como ese usuario.
#!/bin/sh
en la parte superior)Si su fecha ha sido recientemente cambiada por una actualización de usuario o de sistema, zona horaria u otra, entonces crontab comenzará a comportarse erráticamente y mostrará bichos extraños, a veces funcionando, a veces no. Este es el intento de crontab para tratar de "hacer lo que quieras" cuando la hora cambia por debajo de ella. El campo "minuto" se volverá ineficaz después de que se cambie la hora. En este escenario, sólo se aceptarían asteriscos. Reinicie el cron e inténtelo de nuevo sin conectarse a Internet (así la fecha no tendrá oportunidad de reiniciar en uno de los servidores de tiempo).
Si tus cronjobs dejan de funcionar, comprueba que tu contraseña no haya expirado, ya que una vez que lo ha hecho, todos los cronjobs dejan de funcionar.
Habrá mensajes en /var/log/messages
similar a la que se muestra a continuación, que muestra problemas con la autentificación del usuario:
(username) FAILED to authorize user with PAM (Authentication token is no longer valid; new one required)
Si tienes un trabajo de compadreo como..:
php /bla/bla/something.php >> /var/logs/somelog-for-stdout.log
Y en caso de errores espera, que te los envíen, pero no comprueba esto.
PHP por defecto no envía errores a STDOUT. @ver https://bugs.php.net/bug.php?id=22839
Para arreglar esto, agrega en cli`s php.ini o en tu línea (o en tu bash wrapper para PHP) estos:
La primera configuración te permitirá tener fatales como 'Memory oops' y la segunda para redirigirlos a todos a STDERR. Sólo después de que puedas dormir bien ya que todo será enviado al correo de tu root en lugar de sólo registrarte.
EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.