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.