Pregunta Script Ubuntu bash: el shell está cambiando sin ningún motivo


Estoy teniendo un comportamiento extraño con un script de shell en Ubuntu 12.04.1 LTS.

Mi script está programado para ser lanzado cada hora (en crontab). Utiliza / bin / bash, pero a veces cambia a / bin / sh sin ningún motivo.

Aquí hay algunas partes del comando env que estoy registrando desde el script.

El correcto es:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/jdk/jdk1.6.0_35/bin

El equivocado que a veces ocurre es:

SHELL=/bin/sh
PATH=/usr/bin:/bin

El problema es que pierdo la variable PATH y obtengo un error cuando intento ejecutar un comando.

¿Alguna pista? ¡Gracias!


0


origen


¿Has comenzado tu script con #!/bin/bash?
La primera $ PATH es la de su usuario, la segunda $ PATH es la de cron. Cree un pequeño contenedor cron que inicie / bin / bash y configure su $ PATH esperado. - cdleonard


Respuestas:


Es difícil decir por qué a veces funciona y otras no. Así que aquí hay algunas ideas que podrían o no ayudar.

Verifica que tu script comience con

#!/bin/bash

y asegúrese de que la secuencia de comandos se ejecute con el usuario correcto: Esto hará que bash cargue el entorno correcto para ese usuario.

Si quieres asegurarte, también puedes ejecutar explícitamente bash en tus crontab, luego pasa el script para ejecutar con -c argumento.

Si eso no ayuda y necesita una solución rápida, puede optar por ejecutar los comandos en su secuencia de comandos utilizando su ruta completa, por lo que no necesita la corrección PATH en absoluto.

Nota al margen: esta pregunta encajaría mejor en Server Fault o Unix y Linux.


2



Gracias, la secuencia de comandos comienza con la declaración / bin / bash. Sin embargo, ya he encontrado algunas soluciones que solucionan el problema como las que estás sugiriendo. No puedo explicar por qué sucede esto de todos modos ... - Angelo Cavallini


Pon esto al comienzo de tu script:

#!/bin/bash
if [ "$(readlink -f /proc/$$/exe)" != "/bin/bash" ] ; then
    echo restarting script with bash... > &2
    exec /bin/bash $0 "$@"
fi

0





los SHELL variable es el shell de inicio de sesión, no necesariamente el shell en el que se está ejecutando actualmente.

La razón más probable para las diferencias es que a veces se ejecuta desde un shell interactivo, y algunas veces no (cron), en cada caso los archivos de inicio que se ejecutan son diferentes.

Cuando se ejecuta bajo cron, no es un shell de inicio de sesión, por lo que su .profile no se está ejecutando, la razón más probable por la cual PATH es diferente.

Al comienzo de su script, escriba:

source ~/.profile

(o usar . en lugar de source)


0