Ich habe einige Probleme mit einem unserer Upstart-Skripte, die den Benutzer wechseln und einige Ruby-Daemon-Prozesse starten.
In der Vergangenheit habe ich einfach darauf bash -c "do the business" -l someuser
geachtet, das -l
Flag zu verwenden, um ein Login zu emulieren.
Dies hat bis jetzt sehr gut funktioniert. Unser Ruby-Prozess hat den folgenden Fehler ausgelöst: require: no such file to load -- rubygems (LoadError)
Nach einigen Untersuchungen stellte ich fest, dass dieser Fehler nur auftritt, wenn ich das Skript als Root-Benutzer ausführe, dh (wenn ich sudo su
oder wenn ich von upstart ausgeführt werde).
Ich denke, dies ist ein PATH-Problem, da das Problem behoben wird, wenn ich den Pfad zuerst manuell einstelle.
Gibt es eine Möglichkeit, den Benutzer zu wechseln und die gesamte Umgebung zu laden ?
Ich habe es auch versucht su user -c
und sudo
.
Um das Testen zu vereinfachen, "roote" ich ( sudo su
) und laufe which bundle
(Bundle ist eine rubinrote Sache).
Folgendes bekomme ich:
sudo -i -u webuser which bundle
# => keine Ausgabesu -l webuser -c which bundle
# => keine Ausgabesudo su - webuser -c which bundle
# => keine Ausgabe
Aber ssh'd als Webuser
which bundle
# => / opt / ruby / bin / bundle
/etc/profile
~/.bash_profile
~/.bash_login
und ~/.profile
. Bei Login-Shells wertet bash diese in der angegebenen Reihenfolge aus.
su - user -c
?