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

mégas
la source
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="
c0rp
la source
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
Julian Stirling
la source