A menudo, los crontab
scripts no se ejecutan según lo programado o como se esperaba. Existen numerosas razones para eso:
- notación de crontab incorrecta
- problema de permisos
- Variables de entorno
Este wiki de la comunidad tiene como objetivo agregar las principales razones para que los crontab
scripts no se ejecuten como se esperaba. Escribe cada razón en una respuesta separada.
Incluya una razón por respuesta (detalles sobre por qué no se ejecuta) y arregle (s) por esa razón.
Escriba solo problemas específicos de cron, por ejemplo, comandos que se ejecutan como se espera del shell pero que cron ejecuta erróneamente.
crontab -e
para que el cron surta efecto. Por ejemplo, usando vim edito el archivo y lo uso:w
para escribirlo, pero el trabajo no se agrega a cron hasta que también salga. Así que no veré el trabajo hasta después:q
también.Respuestas:
Ambiente diferente
Cron pasa un conjunto mínimo de variables de entorno a sus trabajos. Para ver la diferencia, agregue un trabajo ficticio como este:
Espere a
/tmp/env.output
que se cree, luego elimine el trabajo nuevamente. Ahora compare el contenido de/tmp/env.output
con la salida deenv
ejecución en su terminal regular.Un "problema" común aquí es que la
PATH
variable de entorno es diferente. Tal vez la secuencia de comandos cron utiliza el comandosomecommand
que se encuentra en/opt/someApp/bin
, que se ha añadido aPATH
en/etc/environment
? cron ignoraPATH
de ese archivo, por lo que la ejecuciónsomecommand
de su script fallará cuando se ejecute con cron, pero funcionará cuando se ejecute en una terminal. Vale la pena señalar que las variables de/etc/environment
se pasarán a los trabajos cron, pero no las variables que cron se establece específicamente, comoPATH
.Para evitar eso, simplemente configure su propia
PATH
variable en la parte superior del script. P.ejAlgunos prefieren usar rutas absolutas a todos los comandos en su lugar. Recomiendo contra eso. Considere lo que sucede si desea ejecutar su script en un sistema diferente, y en ese sistema, el comando está en su
/opt/someAppv2.2/bin
lugar. Tendría que pasar por todo el script reemplazando/opt/someApp/bin
en/opt/someAppv2.2/bin
lugar de simplemente hacer una pequeña edición en la primera línea del script.También puede establecer la variable PATH en el archivo crontab, que se aplicará a todos los trabajos cron. P.ej
fuente
env
, me había olvidado por completo de ese comando y pensé que PATH estaba funcionando. En realidad fue ligeramente diferente en mi caso.Mi principal problema: si olvida agregar una nueva línea al final del
crontab
archivo. En otras palabras, el archivo crontab debe terminar con una línea vacía.A continuación se encuentra la sección relevante en las páginas del manual para este problema (
man crontab
luego salte al final):fuente
man crontab
en Ubuntu 10.10 dice "cron requiere que cada entrada en un crontab termine en un carácter de nueva línea. Si la última entrada en un crontab falta la nueva línea, cron considerará que el crontab (al menos parcialmente) está roto y se niegan a instalarlo ". (Y la fecha final es el 19 de abril de 2010.)crontab -e
él, verificará la sintaxis del archivo antes de permitir un guardado, incluida una comprobación de nueva línea.-e
opción, y es independiente del editor.Cron daemon no se está ejecutando. Realmente lo arruiné hace algunos meses.
Tipo:
Si no ve ningún número, entonces cron no se está ejecutando.
sudo /etc/init.d/cron start
se puede usar para iniciar cron.EDITAR: en lugar de invocar scripts de inicio a través de /etc/init.d, use la utilidad de servicio, p. Ej.
EDITAR: También podría usar systemctl en Linux moderno, por ejemplo
fuente
pidof cron
cual omitirá resultados para otras aplicaciones que también tienen la palabra 'cron', como crontab.sudo service cron start
me salestart: Job is already running: cron
service crond start
if its centos / RHELEl guión en nombres de archivo
cron.d/
,cron.daily/
,cron.hourly/
, etc, no debe contener puntos (.
), de otro modo run-parts saltarán ellos.Ver run-parts (8):
Entonces, si tiene un script cron
backup.sh
,analyze-logs.pl
en elcron.daily/
directorio, es mejor que elimine los nombres de extensión.fuente
run-parts --test
(u otra opción imaginaria como la--debug
salida de los archivos que omite, incluido el motivo.)En muchos entornos, cron ejecuta comandos usando
sh
, mientras que muchas personas suponen que lo usarábash
.Sugerencias para probar o corregir esto para un comando que falla:
Intente ejecutar el comando
sh
para ver si funciona:Envuelva el comando en un subshell bash para asegurarse de que se ejecute en bash:
Dile a cron que ejecute todos los comandos en bash configurando el shell en la parte superior de tu crontab:
Si el comando es un script, asegúrese de que el script contenga un shebang:
fuente
bash
, pero no concron
. ¡Gracias!source
está en bash pero no sh. En cron / sh, use un punto: en. envfile
lugar desource envfile
.sh "mycommand"
le dicesh
que ejecute mycommand como un archivo de script. Quiso decirsh -c "mycommand"
? En cualquier caso, esta respuesta parece ser sobre hacer que el comando se ejecute específicamente en bash, entonces, ¿por qué agregaste el comandosh
aquí?Tuve algunos problemas con las zonas horarias. Cron estaba corriendo con la nueva zona horaria de instalación. La solución fue reiniciar cron:
fuente
* * * * * touch /tmp/cronworks
no hacer nada, pero hayRELOAD
cronlog.La ruta absoluta debe usarse para los scripts:
Por ejemplo,
/bin/grep
debe usarse en lugar degrep
:En lugar de:
Esto es especialmente complicado, porque el mismo comando funcionará cuando se ejecute desde el shell. La razón es que
cron
no tiene la mismaPATH
variable de entorno que el usuario.fuente
/usr/bin/whatever
ruta completaSi su comando crontab tiene un
%
símbolo, cron intenta interpretarlo. Por lo tanto, si estaba utilizando algún comando con un%
(como una especificación de formato para el comando de fecha), deberá escapar.Eso y otros buenos trucos aquí:
http://www.pantz.org/software/cron/croninfo.html
fuente
date
dentro de un trabajo de pestaña cron?Cron está llamando a un script que no es ejecutable.
Al ejecutar
chmod +x /path/to/scrip
el script, se vuelve ejecutable y debe resolver este problema.fuente
cron
y fácil de rastrear simplemente intentando ejecutar/path/to/script
desde la línea de comandos.. scriptname
osh scriptname
obash scriptname
, entonces esto se convierte en uncron
problema específico.También es posible que la contraseña del usuario haya expirado. Incluso la contraseña de root puede caducar. Puede
tail -f /var/log/cron.log
y verá que cron fallará con la contraseña caducada. Puede configurar la contraseña para que nunca caduque haciendo esto:passwd -x -1 <username>
En algunos sistemas (Debian, Ubuntu), el registro de cron no está habilitado de forma predeterminada. En /etc/rsyslog.conf o /etc/rsyslog.d/50-default.conf la línea:
debe ser editado (
sudo nano /etc/rsyslog.conf
) sin comentarios para:Después de eso, debe reiniciar rsyslog a través de
o
Fuente: Habilite el registro crontab en Debian Linux
En algunos sistemas (Ubuntu), el archivo de registro separado para cron no está habilitado de forma predeterminada, pero los registros relacionados con cron aparecen en el archivo syslog. Uno puede usar
para ver mensajes relacionados con cron.
fuente
Si su cronjob invoca aplicaciones GUI, debe decirles qué PANTALLA deben usar.
Ejemplo: lanzamiento de Firefox con cron.
Su script debe contener en
export DISPLAY=:0
alguna parte.fuente
* * * * * export DISPLAY=:0 && <command>
Los problemas de permisos son bastante comunes, me temo.
Tenga en cuenta que una solución común es ejecutar todo utilizando el crontab de root, que a veces es una idea realmente mala. Definir los permisos adecuados es definitivamente un problema que se pasa por alto en gran medida.
fuente
Permiso inseguro de la tabla cron
Se rechaza una tabla cron si su permiso es inseguro
El problema se resuelve con
fuente
El script es sensible a la ubicación. Esto está relacionado con el uso siempre de rutas absolutas en un script, pero no exactamente lo mismo. Es posible que su trabajo cron necesite
cd
un directorio específico antes de ejecutarse, por ejemplo, una tarea de rake en una aplicación Rails puede necesitar estar en la raíz de la aplicación para que Rake encuentre la tarea correcta, sin mencionar la configuración de base de datos adecuada, etc.Entonces, una entrada crontab de
23 3 * * * /usr/bin/rake db:session_purge RAILS_ENV=production
sería mejor como
O, para mantener la entrada de crontab más simple y menos frágil:
23 3 * * * /home/<user>/scripts/session-purge.sh
con el siguiente código en
/home/<user>/scripts/session-purge.sh
:fuente
chdir(dirname(__FILE__));
Las especificaciones de Crontab que funcionaban en el pasado pueden romperse cuando se mueven de un archivo crontab a otro. A veces, la razón es que ha movido la especificación de un archivo crontab del sistema a un archivo crontab de usuario o viceversa.
El formato de especificación de trabajo cron difiere entre los archivos crontab de los usuarios (/ var / spool / cron / username o / var / spool / cron / crontabs / username) y los crontabs del sistema (
/etc/crontab
y los archivos en/etc/cron.d
).Los crontabs del sistema tienen un campo adicional 'usuario' justo antes del comando para ejecutar.
Esto provocará errores que indiquen cosas como
george; command not found
cuando mueves un comando/etc/crontab
o un archivo/etc/cron.d
al archivo crontab de un usuario.Por el contrario, cron entregará errores similares
/usr/bin/restartxyz is not a valid username
o similares cuando ocurra lo contrario.fuente
El script cron invoca un comando con la opción --verbose
Tuve un error de secuencia de comandos cron en mí porque estaba en piloto automático mientras escribía la secuencia de comandos e incluí la opción --verbose:
El script se ejecutó bien cuando se ejecutó desde shell, pero falló cuando se ejecutó desde crontab porque la salida detallada va a stdout cuando se ejecuta desde shell, pero en ninguna parte cuando se ejecuta desde crontab. Solución fácil para eliminar la 'v':
fuente
La razón más frecuente por la que he visto que cron falla en un horario incorrectamente establecido. Se necesita práctica para especificar un trabajo programado para las 11:15 pm como en
15 23 * * *
lugar de* * 11 15 *
o11 15 * * *
. El día de la semana para los trabajos después de la medianoche también se confunde MF es2-6
después de la medianoche, no1-5
. Las fechas específicas suelen ser un problema, ya que rara vez las usamos* * 3 1 *
no es el 3 de marzo. Si no está seguro, consulte sus cronogramas cron en línea en https://crontab.guru/ .Si su trabajo con diferentes plataformas utilizando opciones no compatibles, como las
2/3
especificaciones de tiempo, también puede causar fallas. Esta es una opción muy útil pero no está disponible universalmente. También me he encontrado con problemas con listas como1-5
o1,3,5
.El uso de rutas no calificadas también ha causado problemas. La ruta predeterminada suele ser
/bin:/usr/bin
así que solo se ejecutarán los comandos estándar. Estos directorios generalmente no tienen el comando deseado. Esto también afecta a los scripts que utilizan comandos no estándar. También pueden faltar otras variables de entorno.Clobbering un crontab existente me ha causado problemas por completo. Ahora cargo desde una copia de archivo. Esto se puede recuperar del crontab existente usando
crontab -l
si se golpea. Mantengo la copia de crontab en ~ / bin. Se comenta en todo momento y termina con la línea# EOF
. Esto se recarga diariamente desde una entrada crontab como:El comando de recarga anterior se basa en un crontab ejecutable con una ruta de acceso que ejecuta crontab. Algunos sistemas requieren la ejecución de crontab en el comando y la especificación del archivo. Si el directorio es compartido en red, a menudo lo uso
crontab.$(hostname)
como el nombre del archivo. Esto eventualmente corregirá los casos en los que se carga el crontab incorrecto en el servidor incorrecto.El uso del archivo proporciona una copia de seguridad de lo que debería ser el crontab, y permite que las ediciones temporales (la única vez que uso
crontab -e
) se restituyan automáticamente. Hay encabezados disponibles que ayudan a obtener los parámetros de programación correctos. Los he agregado cuando los usuarios inexpertos estarían editando un crontab.Raramente, me he encontrado con comandos que requieren la entrada del usuario. Estos fallan en crontab, aunque algunos funcionarán con la redirección de entrada.
fuente
30 23 * * *
traduce a las 11:15 PM?15 23 * * *
. Corregido ahora.Si está accediendo a una cuenta a través de claves SSH, es posible iniciar sesión en la cuenta, pero no se da cuenta de que la contraseña de la cuenta está bloqueada (por ejemplo, debido a intentos de contraseña vencidos o no válidos)
Si el sistema usa PAM y la cuenta está bloqueada, esto puede detener la ejecución de su cronjob. (He probado esto en Solaris, pero no en Ubuntu)
Puede encontrar mensajes como este en / var / adm / messages:
Todo lo que debe hacer es ejecutar:
como root para desbloquear la cuenta, y el crontab debería funcionar nuevamente.
fuente
Si tiene un comando como este:
y no funciona y no puede ver ningún resultado, no necesariamente significa que cron no está funcionando. El script podría romperse y la salida iría a stderr que no se pasa a / tmp / output. Comprueba que este no es el caso, capturando también esta salida:
para ver si esto te ayuda a resolver tu problema.
fuente
=== Alerta Docker ===
Si estás usando docker,
Creo que es correcto agregar que no pude hacer que cron se ejecute en segundo plano.
Para ejecutar un trabajo cron dentro del contenedor, utilicé supervisor y ejecuté
cron -f
, junto con el otro proceso.Editar: Otro problema: tampoco logré que funcionara al ejecutar el contenedor con la red HOST. Vea este problema aquí también: https://github.com/phusion/baseimage-docker/issues/144
fuente
Estaba escribiendo un script de instalación de shell que crea otro script para purgar los datos de transacciones anteriores de una base de datos. Como parte de la tarea, tenía que configurar el
cron
trabajo diario para ejecutarse en un momento arbitrario, cuando la carga de la base de datos era baja.Creé un archivo
mycronjob
con cron cronograma, nombre de usuario y el comando y lo copié en el/etc/cron.d
directorio. Mis dos trampas:mycronjob
el archivo tenía que ser propiedad de root para ejecutarseUn problema de permiso aparecerá
/var/log/syslog
como algo similar a:La primera línea se refiere al
/etc/crontab
archivo y la posterior a un archivo que coloqué debajo/etc/cront.d
.fuente
Línea escrita de una manera que crontab no entiende. Tiene que estar escrito correctamente. Aquí está CrontabHowTo .
fuente
Cron daemon podría estar ejecutándose, pero en realidad no funciona. Intenta reiniciar cron:
fuente
pidof
cron y no obtuve nada. Intenté usar laservice
utilidad y decía que cron ya se estaba ejecutando. Simplemente ejecuté este comando y ejecutépidof
nuevamente y obtuve un resultado.Escribir en cron a través de "crontab -e" con el argumento de nombre de usuario en una línea. He visto ejemplos de usuarios (o administradores de sistemas) que escriben sus scripts de shell y no entienden por qué no se automatizan. El argumento "usuario" existe en / etc / crontab, pero no en los archivos definidos por el usuario. entonces, por ejemplo, su archivo personal sería algo como:
mientras que / etc / crontab sería:
Entonces, ¿por qué harías lo último? Bueno, dependiendo de cómo desee establecer sus permisos, esto puede ser muy complicado. He escrito guiones para automatizar tareas para usuarios que no entienden las complejidades o que no quieren molestarse con el trabajo pesado. Al establecer permisos para
--x------
, puedo hacer que el script sea ejecutable sin que puedan leerlo (y quizás cambiarlo accidentalmente). Sin embargo, es posible que desee ejecutar este comando con varios otros desde un archivo (lo que hace que sea más fácil de mantener), pero asegúrese de que la salida del archivo esté asignada al propietario correcto. Al hacerlo (al menos en Ubuntu 10.10) se interrumpe tanto la incapacidad para leer el archivo como para ejecutarlo, más el problema antes mencionado de poner períodos en / etc / crontab (que, curiosamente, no causa ningún error al pasarcrontab -e
) .A modo de ejemplo, he visto instancias
sudo crontab -e
utilizadas para ejecutar un script con permisos de root, con un correspondientechown username file_output
en el script de shell. Descuidado, pero funciona. En mi humilde opinión, la opción más elegante es ponerlo/etc/crontab
con el nombre de usuario declarado y los permisos adecuados, por lo quefile_output
va al lugar correcto y al propietario.fuente
A partir de lo que Aaron Peart mencionó sobre el modo detallado, a veces las secuencias de comandos que no están en modo detallado se inicializarán pero no finalizarán si el comportamiento predeterminado de un comando incluido es generar una línea o más en la pantalla una vez que se inicia el proceso. Por ejemplo, escribí un script de respaldo para nuestra intranet que usaba curl, una utilidad que descarga o carga archivos a servidores remotos, y es bastante útil si solo puede acceder a dichos archivos remotos a través de HTTP. El uso de 'curl http://something.com/somefile.xls ' estaba causando que un script que escribí se bloqueara y nunca completara porque escupe una nueva línea seguida de una línea de progreso. Tuve que usar el indicador de silencio (-s) para decirle que no mostrara ninguna información y escribir mi propio código para controlar si el archivo no se pudo descargar.
fuente
/dev/null
. Por ejemplo:some-command > /dev/null
Esto redirigirá solo la salida estándar, y no la salida de error (que generalmente es lo que desea, ya que desea que se le informe de los errores). Para redirigir la salida de error también, usesome-command &> /dev/null
.Aunque puede definir variables de entorno en su crontable, no está en un script de shell. Entonces las construcciones como las siguientes no funcionarán:
Esto se debe a que las variables no se interpretan en el crontable: todos los valores se toman literalmente. Y esto es lo mismo si omite los corchetes. Por lo tanto, sus comandos no se ejecutarán y sus archivos de registro no se escribirán ...
En su lugar, debe definir todas las variables de entorno directamente:
fuente
Cuando se ejecuta una tarea dentro de cron, stdin se cierra. Los programas que actúan de manera diferente en función de si stdin está disponible o no se comportarán de manera diferente entre la sesión de shell y en cron.
Un ejemplo es el programa
goaccess
para analizar archivos de registro del servidor web. Esto NO funciona en cron:y
goaccess
muestra la página de ayuda en lugar de crear el informe. En la cáscara esto se puede reproducir conLa solución
goaccess
es hacer que lea el registro desde stdin en lugar de leerlo desde el archivo, por lo que la solución es cambiar la entrada crontab afuente
En mi caso, cron y crontab tenían diferentes propietarios.
NO funcionaba tuve esto:
Básicamente tuve que ejecutar cron-config y responder las preguntas correctamente. Hay un punto en el que se me solicitó ingresar mi contraseña de usuario de Win7 para mi cuenta de 'Usuario'. Por lo que leí, parece que este es un posible problema de seguridad, pero soy el único administrador en una sola red doméstica, así que decidí que estaba bien.
Aquí está la secuencia de comandos que me puso en marcha:
fuente
En mis servidores RHEL7, los trabajos cron de root se ejecutarían, pero los trabajos de usuario no. Descubrí que sin un directorio de inicio, los trabajos no se ejecutarán (pero verá buenos errores en / var / log / cron). Cuando creé el directorio de inicio, el problema se resolvió.
fuente
Si editó su archivo crontab usando un editor de Windows (a través de samba o algo así) y reemplazó las nuevas líneas con \ n \ r o simplemente \ r, cron no se ejecutará.
Además, si está usando /etc/cron.d/* y uno de esos archivos tiene \ r, cron se moverá a través de los archivos y se detendrá cuando llegue a un archivo defectuoso. ¿No estás seguro si ese es el problema?
Utilizar:
fuente