Holen Sie sich die PID eines Prozesses mit nohup über ssh gestartet

Ich möchte einen Prozess mit nohup auf einem Remote-Computer über ssh starten. Das Problem ist, wie die PID des Prozesses mit nohup gestartet werden kann, sodass der "Prozess tatsächlich etwas tut", nicht irgendeine äußere Shell-Instanz oder ähnliches. Außerdem möchte ich stdout und stderr in Dateien speichern, aber das ist hier nicht das Problem ...

Vor Ort funktioniert es einwandfrei mit

nohup sleep 30 > out 2> err < /dev/null & echo $!

Es gibt mir die genaue PID des Befehls "sleep 30" wieder, die ich auch mit "top" oder "ps aux | grep sleep" sehen kann.

Aber ich habe Probleme, es per ssh aus der Ferne zu machen. Ich habe so etwas versucht

ssh remote_machine 'nohup bash -c "( ( sleep 30 ) & )" > out 2> err < /dev/null'

aber ich kann nicht herausfinden, wo ich das "echo $!" damit es in meiner lokalen shell angezeigt wird. Es werden mir immer falsche PIDs angezeigt, zum Beispiel die der "Bash" -Instanz usw.

Hat jemand eine Idee, wie man das löst?

EDIT: OK, das "bash -c" wird hier möglicherweise nicht benötigt. Wie Lotharyx hervorhob, bekomme ich mit der richtigen PID genau das Richtige

ssh remote 'nohup sleep 30 > out 2> err < /dev/null & echo $!'

Aber dann ist das Problem, dass wenn Sie "sleep 30" durch etwas ersetzen, das eine Ausgabe erzeugt, sagen Sie "echo Hello World!", diese Ausgabe nicht in der Datei "out" endet, weder auf der lokalen noch auf der entfernten Seite. Hat jemand eine Idee warum?

EDIT2: Meine Schuld! Auf dem anderen Gerät war einfach kein Platz mehr, deshalb blieben die Dateien "out" und "err" leer!

Das funktioniert also. Wenn Sie mehrere Befehle in einer Reihe aufrufen möchten, die durch ein Semikolon (;) getrennt sind, können Sie "bash -c" wie folgt verwenden:

ssh remote 'nohup bash -c "echo bla;sleep 30;echo blupp" > out 2> err < /dev/null & echo $!'

Dann wird die PID des "bash -c" auf der lokalen Seite ausgegeben, was in Ordnung ist. (Es ist unmöglich, die PID des "innersten" oder "beschäftigten" Prozesses zu erhalten, da jedes Programm selbst neue Unterprozesse erzeugen kann, es gibt keine Möglichkeit, dies herauszufinden ...)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage