.png)
Ich habe RVM mit „user01“ auf Ubuntu 14.04 installiert und user01 kann meine Rails-Anwendung wie erwartet starten. Ich möchte diese Anwendung jedoch nach dem Systemstart starten. Um dies zu erreichen, versuche ich Folgendes zu verwenden:
/var/script/start.sh
screen -d -m mongrel_rails start -e production -p 8088
/etc/rc.local(vor Exit 0 hinzugefügt)
sh './var/script/start.sh'
Mit den oben genannten Änderungen kann meine Rails-Anwendung nicht gestartet werden. Ich kann dies bestätigen, da keine aktive GNU-Bildschirmsitzung vorhanden ist (der Befehl screen -d -m mongrel_rails... startet eine Bildschirmsitzung und trennt sie. Ich sollte die Sitzung mit dem Befehl „screen -ls“ sehen können, aber das ist nicht der Fall, selbst nachdem ich zu Root gewechselt bin).
Ich wechselte zum Root-Zugriff (sudo su) und versuchte, die Anwendung manuell zu starten, aber es schlug mit folgendem Fehler fehl:
/usr/bin/env: ruby: Keine solche Datei oder kein solches Verzeichnis
Ich dachte, dass RVM/Ruby für Root nicht funktioniert. Ich habe das bestätigt, indem ich „ruby -v“ ausgeführt habe, woraufhin eine Meldung zurückgegeben wurde, die bestätigte, dass die Anwendung nicht installiert wurde. Dies ist bei user01 nicht der Fall, da hier Informationen zur installierten Ruby-Version angezeigt werden.
Ich suchte weiter nach einem Weg, dies zu umgehen und fanddieser Beitragdas den folgenden Befehl vorschlug, um während der Ausführung des Startbefehls zum Benutzer zu wechseln.
su user01 -c '/var/script/start.sh'
Das hat auch nicht geholfen und nach einer Untersuchung stellte ich fest, dass Ruby für user01 nicht funktionierte, als ich mich von root aus mit „su user01“ in dieses Konto einloggte. „ruby -v“ lieferte ebenfalls nicht die erwarteten Informationen. Nach einem manuellen Test stellte ich fest, dass ich durch die Eingabe von „exit“ wieder zu root zurückkam und durch ein weiteres „exit“ wieder zu user01 (dem Konto, mit dem ich mich angemeldet hatte) und Ruby für dieses Konto ordnungsgemäß funktionierte.
Kann jemand einen Weg vorschlagen, dies zu umgehen?
Antwort1
Sie verwendenrvm, daher ist die richtige Art und Weise, mit dem Nichtfinden von Ruby umzugehen,Verwenden Sie einen RVM-Wrapper(auf SysVinit- und Upstart-Systemen).
Erstellen Sie zunächst (optional) einen Alias für Ihre App für das Gemset, das Sie verwenden möchten:
rvm alias create my_app ruby-2.1.4@my_gemset
Erstellen Sie dann die gewünschten Wrapper:
rvm wrapper my_app mongrel_rails
Der Wrapper wird im $rvm_path/wrappers/my_app
Verzeichnis erstellt und Sie rufen ihn dann nach dem Benutzerwechsel von Ihrem Init-Skript aus auf.
su user01 -c '/home/user01/.rvm/wrappers/my_app/mongrel_rails -e production -p 8088'
(Beachten Sie, dass ich dies vollständig entfernt habe screen
, da es kaum einen guten Grund gibt, dies innerhalb eines Bildschirms auszuführen.)
Antwort2
Wenn „/var/script/start.sh“ funktioniert, wenn Sie es als Benutzer01 ausführen, dann hängt Ihr Skript von Umgebungsvariablen ab. Um diese Variablen anzuzeigen, führen Sie „env“ aus. Möglicherweise fehlt etwas, wenn Sie versuchen, es vom Root-Konto über „su user01 -c“ auszuführen.
Ich würde vorschlagen, die spezielle Option „-“ mit su zu verwenden. Aus der Manpage:
-, -l, --login
make the shell a login shell, clears all envvars except
for TERM, initializes HOME, SHELL, USER, LOGNAME and PATH
Ihr Befehl würde also folgendermaßen aussehen:
# su - user01 -c '/var/script/start.sh'
Auf diese Weise macht user01 die Shell zu einer Login-Shell, löscht Umgebungsvariablen und initialisiert alle anderen Dinge, wie auf der Manpage angegeben.