Warum läuft mein Remote-Prozess nach dem Beenden einer ssh-Sitzung immer noch?

15

Ich verfolge eine Remote-Protokolldatei, indem ich diesen Befehl in einer lokalen Shell ausführe:

ssh remotemachine tail -100f /path/to/error_file

Wenn ich diesen Befehl mit der Tastenkombination Strg-C beende, bricht Strg-C den lokalen SSH-Prozess ab und lässt meinen Tail auf dem Remotecomputer laufen. Ich hatte den Eindruck, dass eine Unterbrechung der Verbindung ein Aufhängesignal senden würde (da ich kein Nohup verwende) und den Vorgang abbrechen würde, aber das ist eindeutig nicht der Fall.

Kann jemand mehr Licht ins Dunkel bringen, wenn Aufhängesignale gesendet werden und wenn dies nicht der Fall ist? Der Remotecomputer ist Ubuntu, und meine lokale Shell ist OS X bash, wenn einer der beiden einen Unterschied macht.

Ryan Olson
quelle

Antworten:

13

Dieses Verhalten ist auf das Fehlen eines steuernden Terminals für den laufenden Prozess zurückzuführen. Wenn der Remote-Prozess kein steuerndes Terminal hat, kann der Remote-SSH-Prozess, der Ihre Sitzung abwickelt, den Befehl nicht beenden, der in einem Zombie-Status hängen bleibt, um schließlich von init bereinigt zu werden.

Sie können dies umgehen, indem Sie es mit der Option -t ausführen, wodurch es ein steuerndes Terminal erhält. Dies führt dazu, dass der Prozess beendet wird, wenn Sie den Befehl ssh remote mit gedrückter Strg-C-Taste ausführen.

Die Option -t :

Pseudotty-Zuweisung erzwingen. Hiermit können beliebige bildschirmbasierte Programme auf einem entfernten Rechner ausgeführt werden, was zB bei der Implementierung von Menüdiensten sehr hilfreich sein kann. Mehrere -t-Optionen erzwingen die Zuweisung von tty, auch wenn ssh kein lokales tty hat.

Werfen Sie einen Blick auf man ssh und man sshd, wenn Sie diese Option verwenden, da ein steuerndes Terminal andere Auswirkungen hat, z. B. die Möglichkeit, Escape-Zeichen zu senden.

Nagul
quelle