7 votos

La variable de entorno no es recogida por la aplicación cuando se inicia con Upstart (Ubuntu)

¿Cómo se hace para que una nueva variable de entorno sea recogida por todo el sistema sin reiniciar el servidor?

Como es un servidor Ubuntu 11.x, estoy usando Upstart para iniciar/reiniciar procesos.

He añadido una nueva variable de entorno a /etc/environment que debe ser recogida por uno de los procesos de mi aplicación.

Si inicio el proceso directamente desde mi Shell, la variable se recoge y todo va bien (ya he hecho el origen de /etc/environment para mi sesión). Sin embargo, cuando inicio/reinicio el proceso usando su nombre de servicio Upstart, la variable no se ve.

 sudo start app-name

Estoy bastante seguro de que si reinicio el servidor la nueva variable será recogida, sin embargo me gustaría tratar de evitar eso. Tengo algunos otros procesos vivos que se ejecutan en él que me gustaría evitar la interrupción si es posible.

3voto

rgngl Puntos 2278

Esta pregunta parece contener un montón de sub-preguntas sobre cómo manejar las variables de entorno en un Upstart script, así que pensé en compartir algunas cosas que hago para manejar y probar mi entorno para Upstart y Cron.

Lo primero que hay que saber sobre Upstart, y similares, es que no comparte el mismo entorno que tu terminal activo, así que algo como:

$ export FOO=bar
$ start upstart-name

no funciona porque upstart-name no verá realmente el FOO que acaba de exportar en el actual Shell porque Upstart se ejecuta en un entorno limpio.

Puedes imitar el entorno limpio en el que se ejecuta Upstart (y Cron) con este práctico método que tomé de otra respuesta hace muchas lunas:

# makes the current shell have an environment like cron or upstart
# http://stackoverflow.com/a/2546509/5006
function cronenv() {
  cron_env+="HOME=$HOME\n"
  cron_env+="LOGNAME=$LOGNAME\n"
  cron_env+="PATH=/usr/bin:/bin\n"
  cron_env+="SHELL=/bin/sh\n"
  cron_env+="PWD=$PWD\n"

  if [[ -n $LC_ALL ]]; then
    cron_env+="LC_ALL=$LC_ALL\n"
  fi

  env - `echo -e $cron_env` /bin/sh
}

Simplemente vierte eso en tu .bash_profile o similares y puede ejecutar los comandos como los ejecutaría Upstart:

$ cronenv
$ some/big/command --to --run --as --upstart

Ahora, vamos a configurar un entorno compartido en nuestra caja, lo haremos poniendo nuestras variables de entorno en /etc/profile.d/environ.sh

# /etc/profile.d/environ.sh
export FOO=bar

y luego el abastecimiento que en nuestro Upstart script:

script
  # source our common environment file
  . /etc/profile.d/environ.sh
  exec some/big/command --to --run --as --upstart
end script

Ahora podremos "ver" nuestro entorno en cualquier Shell y en cualquier ShellscriptShell de Upstart que se aprovisione de nuestro archivo común (por defecto, ssh en Ubuntu se aprovisionará de todo de /etc/profile.d ). Sí.

2voto

Pablo Venturino Puntos 1660

Ponga la estrofa env en su archivo de descripción de trabajo upstart.

http://upstart.ubuntu.com/wiki/Stanzas#env

env PIDFILE=/var/run/myprocess.pid

O lo que sea. Todo está en la documentación.

1voto

chovy Puntos 163

Yo tuve el mismo problema. Mi startup script funcionaba bien desde la línea de comandos, pero no desde el upstart script.

Simplemente tuve que buscar mi . /home/username/.bashrc en mi upstart script para que funcione con todas las variables de entorno correctas.

script

  cd /home/me
  . /home/me/.bashrc

  ~/www/app/bin/server.production
end script

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: