He configurado mi variable de entorno usando /etc/profile
:
export VAR=/home/userhome
Entonces si lo hago echo $VAR
se nota/home/userhome
Pero cuando pongo referencia a esta variable en el /etc/init.d/servicename
archivo, no puede encontrar esta variable. Cuando ejecuto service servicename status
usando un /etc/init.d/servicename
archivo con el siguiente contenido:
case "$1" in
status)
cd $VAR/dir
;;
esac
dice /dir: No such file or directory
Pero funciona si corro en /etc/init.d/servicename status
lugar deservice servicename status
¿Cómo puedo hacer que el servicio de Unix vea las variables de entorno?
rc
guión directamente también no funciona de esa manera en los sistemas operativos systemd, como todas las invocaciones de la secuencia de comandos se convierten en invocaciones desystemctl
por un gancho oculto.Respuestas:
El problema es
service
quitar todas las variables de entorno peroTERM
,PATH
yLANG
que es algo bueno. Si está ejecutando el script directamente, nada elimina las variables de entorno, por lo que todo funciona.No desea confiar en variables de entorno externas porque al inicio la variable de entorno probablemente no esté presente y su sistema de inicio probablemente no la configure de todos modos.
Si aún desea confiar en tales variables, obtenga un archivo y lea las variables de él, por ejemplo, cree
/etc/default/servicename
con el contenido:y fuente de su script de inicio, por ejemplo:
fuente
[ ... ]
es una abreviatura para una prueba condicional; ver esta respuesta .-f
es unif
argumento para verificar si el archivo existe.&&
es un operador de cortocircuito: solo.
ejecute el segundo comando si el primero sale con 0. operador de origen o punto: lea y ejecute comandos desde el argumento del nombre de archivo.-z
es unif
argumento para verificar una cadena de longitud cero.>&2
enviar salida a stderr. Ver también Introducción a if .-f
es parte de[
, noif
.[ ... ]
es una abreviatura de untest
comando condicional ; vea esta respuesta .-f
Es untest
argumento para verificar si existe un archivo".[
(otest
) como solo otro comando: todo lo queif
hace es tomar alguna acción en función del estado de salida.$VAR
estar en el guión de inicio, necesito que esté disponible para un programa diferente 2 o 3 llamadas aguas abajo del guión de inicio. P.ej. La secuencia de comandos init llama a start-stop-daemon que llama al Programa 1 (Java) que llama al Programa 2 que necesita$VAR
. Intenté el truco en esta respuesta, pero no parece funcionar en mi situación. ¿Cómo puedo asegurarme de que$VAR
estará disponible para el Programa 2?En mi caso, necesitaba una
RAILS_ENV
que se encuentra en/etc/bash.bashrc
:export RAILS_ENV=staging
. Agregué$(grep RAILS_ENV /etc/bash.bashrc)
y eso hizo que la variable estuviera disponible para el script. Lo hice de esta manera para no tener que incluir el resto del archivo.fuente
Una solución fea que también funcionará:
fuente