Tengo un trabajo cron que ejecuta un script. Cuando ejecuto el script a través de un shell interactivo (ssh'ed to bash) funciona bien. Cuando el script se ejecuta solo a través de cron, falla.
Mi conjetura es que está usando algunas de las variables ambientales establecidas en el shell interactivo. Voy a solucionar el script y eliminarlos.
Después de hacer cambios, sé que podría poner en cola el script en cron para que se ejecute como lo haría normalmente, pero ¿hay alguna manera de que pueda ejecutar el script desde la línea de comando, pero decirle que se ejecute como lo haría desde cron? es decir, en un entorno no interactivo?
unset
.env
y es posible que desee probarenv -i ./my-script.sh
. Además, ¿recibes un mensaje de error?Respuestas:
Las principales diferencias entre ejecutar un comando desde cron y ejecutar en la línea de comando son:
/bin/sh
);cron(8)
ocrontab(5)
man; generalmente solo hayHOME
, talSHELL
vezLOGNAME
, tal vezUSER
, y un pequeñoPATH
);%
personaje especialmente (se convierte en una nueva línea);La siguiente invocación ejecutará el fragmento de shell casi como si fuera invocado desde cron. Supongo que el fragmento no contiene los caracteres
'
o%
.Consulte también la ejecución de un script sh desde el cron , que podría ayudarlo a resolver su problema.
fuente
sudo -u user /path/to/script
también sería una forma de ejecutarlo sin ninguna variable establecida?sudo
borra algunas variables y establece otras en un valor conocido, pero eso depende de cómo esté configurado. A menudo se configura para conservar la configuración regional yTERM
, por ejemplo.Desde el enlace de @ sr_ ( ¿Cómo obtener un entorno limpio en un shell ksh? ), Busqué env, y es posible que desee probar esto:
fuente
echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.sh
salidasinteractive himB
.Te sugiero que uses rutas absolutas para tus scripts cuando lo pongas en cron y lo uses en cualquier otro lugar y para todos y cada uno de los comandos de linux utilizados en él, ¡mejor declaralos como variables y úsalo!
fuente
Cron no necesariamente usa el mismo shell que estás usando. cheque:
Para determinar el shell e intentar la ejecución de su script allí, ¿funciona? Esta es una causa común de problemas para muchas personas que agregan scripts a cron.
Si este es el problema, puede agregar "bash" al comienzo de su script en cron para forzar que este script se ejecute en bash. Si esto no resuelve el problema, avíseme y profundizaré un poco más.
fuente
Si desea ignorar algunas preguntas interactivas proporcionadas por algún script, puede intentar:
O
yes "n"
si desea No todas las preguntas.fuente
Para ejecutar su script en un shell no interactivo (sin tener en cuenta los detalles de
cron
), puede hacerlo a través dessh
.Prueba si realmente terminas en un shell no interactivo:
Ejecute el script en un shell no interactivo:
fuente