Starten der Prozess-ID außer Befehl mit "su -c"

9

Ich führe ein Java-Programm in einer Shell aus und schreibe die Prozess-ID in eine Textdatei. Also, wenn ich das mache:

nohup java app.Main > /dev/null 2>&1 &
echo $! > /var/run/app.pid

Es klappt. Aber ich möchte es wirklich als ein anderer Benutzer ausführen

su - appuser -c "nohup java app.Main > /dev/null 2>&1 &"
echo $! > /var/run/app.pid

Das funktioniert nicht. Gibt es eine Möglichkeit, die Prozess-ID des Befehls mit der Option -c zu starten?

Prasanth
quelle

Antworten:

8

Du kannst tun:

su - appuser -c 'nohup java app.Main > /dev/null 2>&1 &
                 echo "$!"' > /var/run/app.pid

(das setzt voraus, dass die Login-Shell von appuserBourne-ähnlich ist).

su -Setzt die Umgebung zurück. Wenn Sie also Variablen in der Befehlszeile erweitern möchten, muss dies von Ihrer Shell (nicht der Anmeldeshell des Remotebenutzers) wie folgt ausgeführt werden :

su - appuser -c "nohup '$JAVA_BIN' '$JAVA_CLASS' > /dev/null 2>&1 &"'
                 echo "$!"' > /var/run/app.pid

(Dies setzt voraus, dass diese Variablen keine einfachen Anführungszeichen enthalten).

Sie möchten, dass die Umleitung von Ihrer Shell (ausgeführt als root) ausgeführt wird, nicht von appuserder Shell (für die wahrscheinlich keine Schreibberechtigung vorliegt /var/run).

Stéphane Chazelas
quelle
2
Vielen Dank. Das hat funktioniert, aber ich musste es für meinen Fall ein wenig optimieren. Aus irgendeinem Grund musste ich vor $ einen Backslash hinzufügen! und dann musste ich es wegen Berechtigungsproblemen in eine tmp-Datei leiten. In der nächsten Zeile wird es aus der tmp-Datei gelesen und an der richtigen Stelle abgelegt. su - appuser -c "nohup $JAVA_BIN $JAVA_CLASS > /dev/null 2>&1 & echo \$! > /tmp/appid.tmp"
Prasanth
@Prasanth, siehe meine Bearbeitung.
Stéphane Chazelas