332 votos

¿Por qué no funciona mi cronómetro y cómo puedo solucionarlo?

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.

449voto

Eric Leschinski Puntos 592

**Si notas algo incorrecto en esta respuesta o tienes información adicional, entonces por favor edítala. **

Cómo arreglar todos los problemas relacionados con el crontab (Linux)

Primero, la terminología básica:

  • cron(8) es el demonio que ejecuta los comandos programados.
  • crontab(1) es el programa utilizado para modificar los archivos crontab(5) del usuario.
  • crontab(5) es un archivo por usuario que contiene instrucciones para cron(8).

A continuación, la educación sobre Cron:

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.

detalles de la crontab, cómo formular un comando:

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.

  • Los campos están separados por espacios o pestañas.
  • Una coma ( , ) se utiliza para especificar una lista, por ejemplo, 1,4,6,8, lo que significa que se ejecuta en 1,4,6,8.
  • Los rangos se especifican con un guión ( - ) y puede combinarse con las listas, por ejemplo, 1-3,9-12 que significa entre 1 y 3 y luego entre 9 y 12.
  • El / 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.
  • Un asterisco ( * ) en un campo significa el penúltimo (por ejemplo, 0-59) para el campo de los minutos, etc.).
  • Los rangos y pasos pueden ser combinados, por ejemplo. */5 significa que empieza en 0 y luego cada 5.

Depuración de los comandos cron

¡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.

Comprueba que cron está corriendo

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.

cron ejecuta su comando en un entorno restringido.

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.

El último comando de mi agenda no funciona

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).

Comprueba el formato del crontab

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.

Puse un archivo en /etc/cron.{hourly,daily,weely,monthly} y no funciona

  • Comprueba que el nombre del archivo no tiene una extensión ver run-parts
  • Asegúrate de que el archivo tiene permisos de ejecución.
  • Dile al sistema lo que debe usar al ejecutar tu script (por ejemplo, poner #!/bin/sh en la parte superior)

Bichos relacionados con la fecha de Cron

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).

22voto

user193348 Puntos 41

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)

8voto

gaRex Puntos 156

Específico de PHP

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:

  • --define display_startup_errors=1
  • --define display_errors='stderr'.

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.com

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.

Powered by: