also habe ich mich gewundert, warum einige meiner automatisierten Skripte noch SSH-Verbindungen hängen lassen, und bin auf ein seltsames Problem gestoßen: SSH wird, wenn es ohne PTY verwendet wird, nicht beendet, wenn die Ausgabepipe geschlossen wird. Dies wurde bereits in mehreren anderen Fragen hier diskutiert, aber ich habe keine anwendbare Antwort gefunden – einige Leute haben empfohlen, die -t
Option zu verwenden, aber das erfordert PTY und die Weiterleitung funktioniert nicht.
Wie dem auch sei, ich habe das Problem auf das folgende Minimalbeispiel reduziert:
#this works
cat /dev/zero |false
#this never terminates
ssh user@host "cat /dev/zero" |false
Gibt es eine Erklärung, warum SSH SIGPIPE ignoriert, das beim Schreiben in eine bereits tote Pipe (die, die zu „false“ geführt hat) entsteht, oder eine Methode, um dies richtig „funktionieren“ zu lassen?
Beachten Sie, dass das „Weiterleiten“ von SIGPIPE an den Remote-Host nicht erforderlich ist. Das einfache Beenden des SSH-Clients (was genau passieren würde, wenn SIGPIPEs nicht ignoriert würden) führt zum selben Ergebnis mit weniger Komplexität und einigen „korrekteren“ Annahmen.
Danke für eure Ideen!
-mk
BEARBEITEN: passiert nur auf Sun_SSH-Servern, sieht nach einem undokumentierten Problem aus. Ich suche nach einer guten Problemumgehung.
Antwort1
Ich beantworte meine eigene Frage: Dies ist ein bekanntes Problem mit Sun SSH. Die beste Lösung, die ich gefunden habe, besteht darin, „Sun_SSH“ in der Ausgabe zu erkennen ssh -V
und etwas wie das Folgende anzuwenden:
#!/bin/bash
# ....
( ssh host 'localCommand' | remoteCommand || pkill -P $BASHPID )
Sie können es auch $$
anstelle von $BASHPID
in anderen Shells oder in einfacheren Situationen verwenden (wenn Ihre Shell keine anderen untergeordneten Prozesse hat).