Normalmente tengo varios problemas con la forma en que cron ejecuta los scripts, ya que normalmente no tienen la configuración de mi entorno. ¿Hay alguna manera de invocar bash (?) De la misma manera que lo hace cron para poder probar los scripts antes de instalarlos?
253

Respuestas:
Agregue esto a su crontab (temporalmente):
Después de que se ejecute, haga esto:
Esto supone que su cron ejecuta / bin / sh, que es el valor predeterminado independientemente del shell predeterminado del usuario.
fuente
env -cat ~ / cronenv` / bin / sh` también debería escribirse como trabajo cron? por favor da un ejemploCron proporciona solo este entorno de forma predeterminada:
HOMEdirectorio de inicio del usuarioLOGNAMEinicio de sesión del usuarioPATH=/usr/bin:/usr/sbinSHELL=/usr/bin/shSi necesita más, puede obtener un script donde defina su entorno antes de la tabla de programación en el crontab.
fuente
.por lo general ya no forma partePATH, por razones de seguridad .Par de enfoques:
Exportar cron env y obtenerlo:
Añadir
a su crontab, déjelo correr una vez, apáguelo, luego ejecute
Y ahora estás dentro de una
shsesión que tiene el entorno de cronLleva tu entorno a cron
Puede omitir el ejercicio anterior y simplemente hacer una
. ~/.profiletarea en frente de su trabajo cron, p. Ej.Usar pantalla
Las dos soluciones anteriores todavía fallan porque proporcionan un entorno conectado a una sesión X en ejecución, con acceso a
dbusetc. Por ejemplo, en Ubuntu,nmcli(Network Manager) funcionará en los dos enfoques anteriores, pero aún falla en cron.Agregue la línea anterior al cron, déjelo correr una vez, apáguelo nuevamente. Conéctese a su sesión de pantalla (screen -r). Si está comprobando que la sesión de pantalla se ha creado (con
ps), tenga en cuenta que a veces están en mayúsculas (por ejemplops | grep SCREEN)Ahora incluso
nmcliy similares fallarán.fuente
Tu puedes correr:
Esto ejecutará your_command con un entorno vacío.
fuente
env - HOME="$HOME" LOGNAME="$USER" PATH="/usr/bin:/bin" SHELL="$(which sh)" command argumentsque parece hacer el trucoDependiendo del shell de la cuenta
o
De http://matthew.mceachen.us/blog/howto-simulate-the-cron-environment-1018.html
fuente
Respondiendo seis años después: el problema del desajuste del entorno es uno de los problemas resueltos por los
systemd"temporizadores" como reemplazo de cron. Ya sea que ejecute el "servicio" systemd desde la CLI o vía cron, recibe exactamente el mismo entorno, evitando el problema de falta de coincidencia del entorno.El problema más común para hacer que los trabajos cron fallen cuando pasan manualmente es el
$PATHajuste predeterminado restrictivo establecido por cron, que es esto en Ubuntu 16.04:Por el contrario, el valor predeterminado
$PATHestablecidosystemden Ubuntu 16.04 es:Por lo tanto, ya hay una mejor posibilidad de que un temporizador systemd encuentre un binario sin más problemas.
La desventaja de los temporizadores systemd es que hay un poco más de tiempo para configurarlos. Primero crea un archivo de "servicio" para definir lo que desea ejecutar y un archivo "temporizador" para definir la programación para ejecutarlo y finalmente "habilita" el temporizador para activarlo.
fuente
Cree un trabajo cron que ejecute env y redirija stdout a un archivo. Use el archivo junto a "env -" para crear el mismo entorno que un trabajo cron.
fuente
No olvide que, dado que el padre de cron es init, ejecuta programas sin un terminal de control. Puede simular eso con una herramienta como esta:
http://libslack.org/daemon/
fuente
Por defecto,
cronejecuta sus trabajos utilizando la idea de su sistemash. Este podría ser el actual Bourne shell odash,ash,kshobash(u otro) se enlazan ash(y como resultado se ejecuta en modo POSIX).Lo mejor que puede hacer es asegurarse de que sus scripts tengan lo que necesitan y asumir que no se les proporciona nada. Por lo tanto, debe usar especificaciones de directorio completas y establecer variables de entorno como
$PATHusted.fuente
0 0 * * 1 /path/to/executable >/dev/null 2>&1y luego, dentro de "ejecutable", establecería valores para$PATH, etc., y usaría especificaciones de directorio completas para ingresar y sacar archivos, etc. Por ejemplo:/path/to/do_something /another/path/input_file /another/path/to/output_fileOtra forma simple que he encontrado (pero puede ser propenso a errores, todavía estoy probando) es obtener los archivos de perfil de su usuario antes de su comando.
Edición de un script /etc/cron.d/:
Se convertiría en:
Sucio, pero hizo el trabajo por mí. ¿Hay alguna manera de simular un inicio de sesión? ¿Solo un comando que podrías ejecutar?
bash --loginno funcionó Sin embargo, parece que esa sería la mejor manera de hacerlo.EDITAR: Esta parece ser una solución sólida: http://www.epicserve.com/blog/2012/feb/7/my-notes-cron-directory-etccrond-ubuntu-1110/
fuente
La respuesta aceptada ofrece una forma de ejecutar un script con el entorno que usaría cron. Como otros señalaron, este no es el único criterio necesario para depurar trabajos cron.
De hecho, cron también usa un terminal no interactivo, sin una entrada adjunta, etc.
Si eso ayuda, he escrito un script que permite ejecutar sin problemas un comando / script como lo ejecutaría cron. Invoque con su comando / script como primer argumento y estará bien.
Este script también está alojado (y posiblemente actualizado) en Github .
fuente
La respuesta https://stackoverflow.com/a/2546509/5593430 muestra cómo obtener el entorno cron y usarlo para su script. Pero tenga en cuenta que el entorno puede variar según el archivo crontab que utilice. Creé tres entradas cron diferentes para salvar el entorno a través de
env > log. Estos son los resultados en un Amazon Linux 4.4.35-33.55.amzn1.x86_64.1. Global / etc / crontab con usuario root
2. Crontab de usuario de root (
crontab -e)3. Script en /etc/cron.hourly/
Lo más importante
PATH,PWDyHOMEdifieren. Asegúrese de configurarlos en sus scripts cron para confiar en un entorno estable.fuente
No creo que exista; la única forma en que sé probar un trabajo cron es configurarlo para que se ejecute uno o dos minutos en el futuro y luego esperar.
fuente