Dies ist eine Frage, die nicht nur hier, sondern auch an anderen Stellen des Stack-Exchange-Netzwerks mehrfach angesprochen wurde (z. B. wie man ssh veranlasst, den Remote-Prozess zu beenden, wenn ich ssh selbst unterbreche? ). Ich kann jedoch keine der Lösungen für mich arbeiten lassen.
Ich führe einen Befehl über ssh aus. Immer wenn ich ssh beende, möchte ich, dass der Befehl ebenfalls stirbt. Dieser Befehl ist ein Daemon namens ktserver, der auf unbestimmte Zeit ausgeführt wird, bis Sie Strg-C drücken.
Ich führe es folgendermaßen aus: ssh -t compute-0-1 ktserver
Wenn ich Strg-C drücke, wird der Vorgang ordnungsgemäß beendet und die SSH-Sitzung wird beendet.
Wenn ich jedoch nicht Strg-C drücke, sondern den ssh-Prozess mit dem kill
Befehl beende (z. B. SIGINT oder SIGHUP senden), ktserver
bleibt der Prozess am Leben.
Wie kann ich das ktserver
Sterben immer unabhängig davon machen, wie ssh
es getötet wird?
BEARBEITEN : Wenn ktserver
ich stattdessen etwas völlig anderes ausführe, wie zum Beispiel gedit
, funktioniert alles wie ein Zauber (dh gedit stirbt, wenn die Verbindung unterbrochen wird). Daher ist möglicherweise etwas mit dem Prozess selbst nicht in Ordnung. Zum Beispiel dachte ich, dass es SIGHUP oder SIGINT ignorieren könnte. Wenn ich jedoch kill -1 ktserver
oder kill -2 ktserver
starte, stirbt der Prozess wie erwartet.
EDIT2 : Wie Mark Plotnick betont , hängt das Problem damit zusammen, dass auf dem SSH-Kanal keine Kommunikation zirkuliert. Ich habe bestätigt, indem ich ssh -t <host> read
den ssh-Prozess anschließend ausgeführt und beendet habe. read
war noch am Leben und trat.
kill -9 ktserver
?ssh example.com dd ...
Aufträge ausgeführt, die auch Stunden nach demssh
Unterbrechen der Verbindung aufgrund von Netzwerkproblemen vollständig ausgeführt wurden. Wenn Siektserver
die Option ändern können , ab und zu etwas auszugeben, kann dies eine Problemumgehung sein.read
auf dem Remote-Computer zu laufen, und nachdem ich die SSH-Verbindung beendet habe, bin ichread
nicht gestorben. Leider kann ich ktserver nicht ändern, um etwas auszugeben. Gibt es dann keine Lösung?shopt -s huponexit
). Können Sie testen, ob dies bei Ihnen funktioniert?Antworten:
Normalerweise stirbt die Shell auch, wenn die SSH-Verbindung unterbrochen wird. Sie können Ihre Shell so konfigurieren, dass sie ein Signal -1 (SIGHUP) sendet, wenn sie an alle untergeordneten Elemente terminiert.
Für Bash können Sie diese Option über den eingebauten Befehl shopt konfigurieren . (
shopt -s huponexit
).Für zsh willst du .
setopt
HUP
quelle
ssh -t -t
(-t
zweimal beachten !) Verwendet habe , was die Zuweisung von tty erzwingt, anstatt nur pty.Ich fand das einfach
-t -t
als Argument, umssh
es zum Laufen zu bringen. Ich musstehuponexit
weder auf die ursprüngliche noch auf die entfernte Shell setzen.Ich habe das wie folgt getestet:
Funktioniert nicht:
Dadurch wurde die SSH-Sitzung beendet, aber ich kann sehen, dass der Ruhezustand auf dem Remotehost noch ausgeführt wird (wird
ps -ef | grep sleep
angezeigt).Funktioniert:
Dadurch wird die SSH-Sitzung beendet und der Remote-Schlafvorgang wurde ebenfalls beendet. Ich habe auch überprüft, dass das Signal, das an den Remote-Prozess gesendet wird, ist,
SIGINT
wenn Sie Control- verwenden C. Ich habe auch überprüft, dass SIGKILL (-9), das auf denssh
Prozess angewendet wurde, auch den Remote-Prozess beendet.EDIT 1:
Das galt für
sleep
... für hartnäckigere Remote-Prozesse. Ich fand, dassssh
^ C anders gehandhabt wird als SIGINT. Ctrl- hat Cfunktioniert, aberkill -INT $pid
nichtFolgendes habe ich schließlich für meine eigentliche Bewerbung gefunden (aus den anderen Antworten stehlen).
Beachten Sie die geschachtelte Verwendung von doppelten und einfachen Anführungszeichen. Beachten Sie, dass Ihr Remote-Prozess auf SIGHUP reagieren MUSS, indem er tatsächlich beendet wird!
quelle
cat
. Zum Beispielssh -ttq user@host '{ cmd; cmd; } | cat'
Ctrl-C
ist NICHT immer gleichbedeutend mitkill -INT $pid
, siehe meine Antwort auf unix.stackexchange.com/questions/377191/… und eine andere auf stackoverflow.com/questions/8398845/… für die blutigen Details ;-)^C
SIGINT gesendet wird . Was ist der genaue Unterschied, wenn sie nicht gleichwertig sind?Wenn ssh keine Signale verbreitet, empfängt es was würden Sie von ihm erwarten?
UPD. (speziell für JosephR): Es handelt sich offensichtlich um einen Fehler, der sich aus einem Missverständnis ergibt - "Kill-Prozess, der von ssh ausgelöst wird, wenn ssh stirbt". SSH erzeugt normalerweise keine Prozesse (manchmal schon, aber das ist eine andere Geschichte), SSHD hingegen, wenn wir uns die andere Seite der Verbindung ansehen. SSH stützt sich lediglich auf die Pseudo-Terminal-Abstraktion, die der Remote-Server hat. Deshalb kann nur die Fähigkeit des Terminals helfen, Signale an die angeschlossenen Prozesse zu senden. Dies ist für jedes UNIX-ähnliche System etwas sehr grundlegend.
quelle
Die hier gepostete Lösung hat bei mir nicht funktioniert, aber da diese Frage zuerst auftauchte, als ich nach einer Lösung für ein ähnliches Problem suchte und hier auch ein
-t -t
Trick erwähnt wurde, werde ich eine Lösung posten, die bei mir funktioniert hat, damit andere es versuchen.Mein Langzeitbefehl wurde nicht mehr ausgeführt, als die Verbindung auf diese Weise beendet wurde.
quelle