(Ya he leído ¿Cómo puedo probar un nuevo script cron? )
Tengo un problema específico (el trabajo cron no parece ejecutarse o no se ejecuta correctamente), pero el problema es general: me gustaría depurar los scripts cronnados. Soy consciente de que puedo configurar una línea * * * * * crontab, pero esa no es una solución totalmente satisfactoria. Me gustaría poder ejecutar un trabajo cron desde la línea de comando como si cron lo estuviera ejecutando (el mismo usuario, las mismas variables de entorno, etc.). ¿Hay alguna forma de hacer esto? Tener que esperar 60 segundos para probar los cambios en el script no es práctico.
Respuestas:
Esto es lo que hice, y parece funcionar en esta situación. Al menos, me muestra un error, mientras que se ejecuta desde la línea de comandos ya que el usuario no muestra el error.
Paso 1 : pongo esta línea temporalmente en el crontab del usuario:
luego lo sacó una vez que se escribió el archivo.
Paso 2 : me hice un pequeño script bash run-as-cron que contiene:
Entonces, como usuario en cuestión, pude
Obviamente, esta solución podría ampliarse para hacer uso de sudo o similar para una mayor flexibilidad.
Espero que esto ayude a otros.
fuente
/usr/bin
. 2) Lascat …/cron-env
salidas de varias líneas, que no funciona. Simplemente intente ejecutar/usr/bin/env -i $(cat cron-env) echo $PATH
en el terminal, genera el entorno literalmente en lugar de usarlo. 3) El entorno actual se filtra en el entorno cron emulado. Proveedores:export foo=leaked; run-as-cron echo $foo
.cat
genera varias líneas, que funcionan, porque la sustitución de shell las contrae en una sola línea, con la que puede verificarecho $(cat cron-env ) | wc
; su comando de ejemplo/usr/bin/env -i $(cat cron-env) echo $PATH
, sustituye$PATH
desde el shell de llamada; en su lugar, debería invocar una subshell para sustituir en la subenvironement, por ejemplo/usr/bin/env -i $(cat cron-env) /bin/sh -c 'echo $PATH'
. 3. Has cometido el mismo error, sustituyendo nuevamente en el shell de llamada en lugar de en el subambienteLes presento una solución basada en la respuesta de Pistos, pero sin los defectos.
Agregue la siguiente línea al crontab, por ejemplo, usando
crontab -e
Cree un script de shell que ejecute un comando en el mismo entorno en el que se ejecutan los trabajos cron:
Utilizar:
p.ej
Tenga en cuenta que el segundo argumento necesita ser citado si requiere un argumento. La primera línea del script carga un shell POSIX como intérprete. La segunda línea obtiene el archivo de entorno cron. Esto es necesario para cargar el shell correcto, que se almacena en la variable de entorno
SHELL
. Luego carga un entorno vacío (para evitar fugas de variables de entorno en el nuevo shell), inicia el mismo shell que se utiliza para cronjobs y carga las variables de entorno cron. Finalmente se ejecuta el comando.fuente
Como crontab no hace el trabajo, manipularás su contenido:
Que hace :
fuente
sudo -H -u otheruser bash -c 'crontab..."
ejecutar el crontab de otro usuario por ciertoPor defecto, con la mayoría de los demonios cron predeterminados que he visto, simplemente no hay forma de decirle a cron que se ejecute aquí ahora mismo. Si está utilizando anacron, puede ser posible, creo, ejecutar una instancia separada en primer plano.
Si sus scripts no se ejecutan correctamente, entonces no está teniendo en cuenta que
Desde crontab (5):
En general, la RUTA es el mayor problema, por lo que debe:
Si necesita ejecutar el script como otro usuario sin shell (por ejemplo, www-data), use sudo:
Lo primero que debe probar antes de todo eso, por supuesto, es que su script realmente hace lo que se supone que debe hacer desde la línea de comandos. Si no puede ejecutarlo desde la línea de comandos, obviamente no funcionará con cron.
fuente
El guión de Marco no me funcionó por alguna razón. No tuve tiempo de depurar, así que escribí un script de Python que hace lo mismo. Es más largo, pero: primero, funciona para mí, y segundo, me resulta más fácil de entender. Cambie "/ tmp / cron-env" donde guardó su entorno. Aquí está:
fuente
Bueno, el usuario es el mismo que pones en la entrada crontab (o en el crontab en el que lo pones, alternativamente), por lo que es obvio.
crontab
(5) debería darle la lista de variables de entorno establecidas, solo hay unas pocas.fuente
En la mayoría de los crontabs como, por ejemplo, vixie-cron, puede colocar variables en el crontab en sí de esta manera y luego usar / usr / bin / env para verificar si funcionó. De esta manera, puede hacer que su script funcione en crontab una vez que descubra cuál es el problema con el script run-as-cron.
fuente
La solución de Marco no funcionó para mí, pero el script de Python de Noam funcionó. Aquí hay una ligera modificación en el guión de Marco que lo hizo funcionar para mí:
Las
set -a
variables de exportación agregadas definidas en el script $ 1 y lo pusieron a disposición para ordenar $ 2ps La pitón de Noam funcionó porque 'exportó' el entorno al proceso hijo.
fuente
Si se trata de un script de shell, esto debería ayudarlo la mayor parte del camino:
Definitivamente resaltará algunos problemas, si no todo.
fuente
Nunca he encontrado una manera de ejecutar trabajos cron manualmente, pero este artículo sugiere configurar el mismo entorno que tendría el cronjob y ejecutar el script manualmente.
fuente
puedes programar el trabajo para comenzar el siguiente minuto :)
fuente
Dije a la respuesta de Marco. El código se muestra a continuación, pero mantendré este script aquí .
Dado este crontab:
Sesión de uso de muestra:
Esto es
cronTest2
, que debe invocarse correctamente para configurar las variables de entorno de la misma manera que lo hace cron:cronTest
se ejecutacronTest2
con las variables de entorno adecuadas establecidas:fuente