2012-09-28 15 views
8

Ich möchte einen Prozess mit nohup auf einem Remote-Rechner über ssh starten. Das Problem ist, wie man die PID des mit nohup gestarteten Prozesses bekommt, also den "Prozess, der tatsächlich etwas macht", nicht irgendeine äußere Shell-Instanz oder dergleichen. Auch möchte ich stdout und stderr in Dateien speichern, aber das ist hier nicht das Thema ...Holen Sie sich die PID eines Prozesses gestartet mit nohup über ssh

Auf lokaler Ebene funktioniert es einwandfrei

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

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

Aber ich habe Probleme, es remote über ssh zu tun. Ich habe versucht, etwas wie

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

aber ich kann nicht herausfinden, wo das "Echo $!" so dass es in meiner lokalen Shell angezeigt wird. Es zeigt mir immer falsche PIDs, zum Beispiel die der "Bash" -Instanz usw.

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

EDIT: OK, die "Bash-C" wird hier möglicherweise nicht benötigt. Wie Lotharyx darauf hingewiesen, erhalte ich die richtige PID ganz gut

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

dann aber das Problem ist, dass, wenn Sie ersetzen „sleep 30“ mit etwas, das Ausgangssignal erzeugt, sagen wir, „Hallo Welt Echo!“, Dass der Ausgang endet nicht in der Datei "out", 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. Darüber hinaus, wenn man durch ein Semikolon mehrere Befehle in einer Reihe, getrennt anrufen will (;), kann man immer noch „bash -c“ verwenden, etwa so:

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

Dann druckt er die PID der aus "bash-c" auf der lokalen Seite, das ist in Ordnung. (Es ist unmöglich, die PID des "innersten" oder "beschäftigt" -Prozesses zu bekommen, weil jedes Programm selbst neue Subprozesse erzeugen kann, es gibt keine Möglichkeit, das herauszufinden ...)

Antwort

8

Ich habe folgendes versucht (das lokale Maschine ist Debian, die Remote-Rechner ist CentOS), und es hat funktioniert genau so, wie ich denke, Sie erwarten:

 
    ~# ssh [email protected] 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 
    [email protected]'s password: 
    14193 
    ~# 

Auf dem Remote-Rechner, ich habe ps -e und sah diese Zeile:

 
    14193 ?  00:00:00 sleep 

Also, klar, auf meinem lokalen Rechner, ist die Ausgabe der PID von "Schlaf" auf dem Remote-Rechner ausgeführt.

Warum fügen Sie Bash Ihrem Befehl hinzu, wenn Sie es über einen SSH-Tunnel senden?

+0

Hmm, Sie haben Recht, aber es scheint immer noch ein Problem mit der Standardausgabe zu sein. Wenn ich zum Beispiel "sleep 30" durch etwas, das eine Ausgabe erzeugt, ersetzt, wie "Echo Hello World!", Endet es nicht in der Datei "out", sondern wird mir genauso zurückgegeben wie die PID. –

+0

Ich denke, ich habe die "bash -c" hinzugefügt, weil ich mehrere Befehle hintereinander ausführen wollte, wie "echo foo; sleep 30; echo bar". –

+0

Meine Schuld, Ihre Lösung funktioniert absolut! –

Verwandte Themen