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:
HOME
directorio de inicio del usuarioLOGNAME
inicio de sesión del usuarioPATH=/usr/bin:/usr/sbin
SHELL=/usr/bin/sh
Si 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
sh
sesión que tiene el entorno de cronLleva tu entorno a cron
Puede omitir el ejercicio anterior y simplemente hacer una
. ~/.profile
tarea 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
dbus
etc. 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
nmcli
y 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 arguments
que 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
$PATH
ajuste predeterminado restrictivo establecido por cron, que es esto en Ubuntu 16.04:Por el contrario, el valor predeterminado
$PATH
establecidosystemd
en 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,
cron
ejecuta sus trabajos utilizando la idea de su sistemash
. Este podría ser el actual Bourne shell odash
,ash
,ksh
obash
(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
$PATH
usted.fuente
0 0 * * 1 /path/to/executable >/dev/null 2>&1
y 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_file
Otra 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 --login
no 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
,PWD
yHOME
difieren. 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