La variable HOME n'est pas définie


12

J'ai deux serveurs, ils sont identiques (je crois), des serveurs de production et de transfert.

Et j'ai un script parvenu dans le /etc/init/dossier.

description "Discoure process"

setuid deploy
setgid deploy

respawn
respawn limit 3 30

start on runlevel [2345]
stop on runlevel [06]

script
exec /bin/bash <<'EOT'
  echo \"$HOME/.rbenv\"

  cd /home/deploy/discourse/current

  bundle exec bluepill load config/discourse.pill --no-privileged --base-dir tmp/bluepill --logfile log/bluepill.log
EOT
end script

Sur le serveur intermédiaire, cela fonctionne bien, mais lorsque j'exécute ce script sur le serveur de production, la variable HOME est vide, le code echo "$HOME/.rbenv"est évalué en"/.rbenv"

Quel pourrait être un problème ici? Merci


Je ne connais pas la cause profonde, mais pourquoi ne pas la définir d'abord, statiquement cependant?
jobin

Pourquoi le script bash encombrant? Il semble que (da) sh l'interpréterait parfaitement.
David Foerster

Réponses:


11

Lisez cette question sur stackoverflow.com et cette réponse par utilisateur grawitysur superuser.com

Vous ne devez pas l'utiliser $HOMEdans init.d, car il n'est pas clair quels utilisateurs utilisent à la maison, jusqu'à ce que cet utilisateur se connecte.

Citation de la spécification POSIX :

HOME
The system shall initialize this variable at the time of login to be a pathname
of the user's home directory. See <pwd.h>.

Vous pouvez utiliser un petit hack, pour obtenir le dossier personnel de l'utilisateur myuserdans votre script

su - myuser -c /usr/bin/env | grep HOME

Il est préférable d'utiliser le script ci-dessous, car il peut généralement y avoir d'autres HOME_*dossiers. Tels que JAVA_HOMEetc.

su - myuser -c /usr/bin/env | grep "^HOME="

8

On dirait que $ HOME est interprété avant de passer à bash? J'essaierais l'un des suivants. Soit ajoutez:

env HOME=/home/MyName

au code juste après la description.

Ou déplacez le code de l'intérieur du bloc de script vers un autre fichier de script avec:

#! /bin/bash

comme ligne 1. Ensuite,

exec /path/to/my/script.sh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.