Wie beendete man SSH-Tunnel?
Wie beendete man SSH-Tunnel?
Hallo,
in letzter Zeit benutze ich immer wieder mal SSH-Remote-Tunnel.
Sehr praktische und sehr Sache, mit der man nicht jedesmal einen Port an der Firewall aufmachen muss.
Leider passiert es manchmal, dass diese Ports (durch einen vorzeitigen unerwarteten DC) längere Zeit aktiv bleiben und die entsprechenden Ports nicht mehr benutzt werden können.
Da habe ich nur die Wahl, den Server neuzustarten
Gibt es da vielleicht eine einfachere Methode, alle bestehenden Tunnel-Ports wieder zu schliessen?
in letzter Zeit benutze ich immer wieder mal SSH-Remote-Tunnel.
Sehr praktische und sehr Sache, mit der man nicht jedesmal einen Port an der Firewall aufmachen muss.
Leider passiert es manchmal, dass diese Ports (durch einen vorzeitigen unerwarteten DC) längere Zeit aktiv bleiben und die entsprechenden Ports nicht mehr benutzt werden können.
Da habe ich nur die Wahl, den Server neuzustarten
Gibt es da vielleicht eine einfachere Methode, alle bestehenden Tunnel-Ports wieder zu schliessen?
Re: Wie beendete man SSH-Tunnel?
Mit
ps aux
die laufenden Tasks anzeigen lassen, den Tunnel erkennen (das ist nicht schwer) und mit kill -9 pid beenden. Mal davon abgesehen, dass eine Tunnel-Leiche im Hintergrund keinen Port besetzt, so daß er "nicht mehr benutzt werden kann".
ps aux
die laufenden Tasks anzeigen lassen, den Tunnel erkennen (das ist nicht schwer) und mit kill -9 pid beenden. Mal davon abgesehen, dass eine Tunnel-Leiche im Hintergrund keinen Port besetzt, so daß er "nicht mehr benutzt werden kann".
- heisenberg
- Beiträge: 4146
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: Wie beendete man SSH-Tunnel?
Es ist eine sehr schlechte Angewohnheit sofort mit Signal 9(KILL) Prozesse bedingungslos und ohne Not abzuschießen. Signal 9 heisst: Den Prozess sofort beenden, ohne dass dieser die Chance hat noch irgend etwas zu tun um ordnungsgemäss zu beenden, z. B. das hier...
- Keine Aufräumarbeiten von temporären Dateien,
- Kein ordentliches schließen von Sockets,
- Keine information von erzeugten Kindprozessen über das Prozessende
- Kein Zurücksetzen der Terminaleinstellungen auf Ausgangszustand
Besser wäre beispielsweise mal mit diesen Signalen aufsteigende Reihenfolge, von denen jeweils der nächstdrastischere verwendet wird, wenn ein Prozeß sich nicht beenden möchte:
- TERM (15)
- INT (2)
- HUP (1)
- KILL (9) --- Erst dann nutzen, wenn die anderen Signale ohne Wirkung bleiben.
Code: Alles auswählen
man 7 signal
Code: Alles auswählen
soft_kill() {
local pid="$1"
for signal in TERM INT HUP KILL ;do
# Wenn der Prozess noch lebt, ihm das aktuelle Signal schicken.
kill -0 $pid && kill -$signal $Pid
sleep 5
done
}
# Aufruf:
soft_kill 12345
Das Signal 0 ist ein Pseudosignal, dass prüft, ob man das Recht hat dem angegebenen Prozess ein Signal zu senden und ob dieser Prozess überhaupt noch existiert.
Manche Prozesse brauchen bedeutend länger, um sich ordnungsgemäß herunterzufahren. (Z. B. Java-Anwendungsserver).
Zuletzt geändert von heisenberg am 13.03.2019 09:21:00, insgesamt 1-mal geändert.
Re: Wie beendete man SSH-Tunnel?
Leider bleibt die "Leiche" schon noch einige Minuten.dirk11 hat geschrieben:12.03.2019 00:12:30Mit
ps aux
die laufenden Tasks anzeigen lassen, den Tunnel erkennen (das ist nicht schwer) und mit kill -9 pid beenden. Mal davon abgesehen, dass eine Tunnel-Leiche im Hintergrund keinen Port besetzt, so daß er "nicht mehr benutzt werden kann".
Code: Alles auswählen
Mar 12 17:35:54 pizds sshd[19186]: error: bind: Address already in use
Mar 12 17:35:54 pizds sshd[19186]: error: channel_setup_fwd_listener_tcpip: cannot listen to port: 31433
-
- Beiträge: 3293
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Wie beendete man SSH-Tunnel?
@heisenberg: Kann man an das kill noch ein && return hängen um das sleep nicht umsonst abzuwarten? Ansonsten habe ich mir das als softkill <PID> [SLEEP] mal in PATH getan. Wobei ich gerne noch ein pidof $PID hätte wenn PID nicht numerisch ist...
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Re: Wie beendete man SSH-Tunnel?
Dennoch belegt eine solche "Tunnelleiche" keinen Port - jedenfalls nicht so, daß sich niemand mehr verbinden kann, außer Du hast in der sshd_config die Anzahl der aktiven Verbindungen auf "1" gesetzt (was nicht klug ist).Filidore hat geschrieben:12.03.2019 19:19:53Und da dachte ich mir, wirf die "Tunnelleichen" einfach raus, bevor reconnected wird.
- heisenberg
- Beiträge: 4146
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: Wie beendete man SSH-Tunnel?
Das hilft leider nix. Das Ziel ist ja nicht dem Prozeß nur ein Signal zu schicken. Du willst ja wissen ob er auch tatsächlich weg ist. Und wenn Du gleich mit return weggehst, dann prüfst Du das ja nicht mehr.inne hat geschrieben:12.03.2019 20:02:43Kann man an das kill noch ein && return hängen um das sleep nicht umsonst abzuwarten?
Statt einem einfachen sleep könnte man diese Funktion verwenden:
Code: Alles auswählen
sleep_pid() {
# Aufruf; wait_pid <PID> <Sekunden>
# Warte in 0,1 Sekundenschritten solange bis entweder
# PID nicht mehr existiert oder die angegebene Sekundenzahl erreicht wurde
local pid=$1
local steps=$(( $2 * 10 ))
for((step=1;step<=$steps;step++));do
kill -0 $pid 2>/dev/null || return
sleep 0.1
done
}
Ja. Kann man ja am Anfang mit pidof bzw. pgrep zu einer PID(können aber auch mehrere PIDS werden) auflösen und mit einer entsprechenden Prüfung ob numerisch oder nicht.Wobei ich gerne noch ein pidof $PID hätte wenn PID nicht numerisch ist...
-
- Beiträge: 3293
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Wie beendete man SSH-Tunnel?
Stimmt natürlich.heisenberg hat geschrieben:13.03.2019 09:19:27Das hilft leider nix. Das Ziel ist ja nicht dem Prozeß nur ein Signal zu schicken. Du willst ja wissen ob er auch tatsächlich weg ist. Und wenn Du gleich mit return weggehst, dann prüfst Du das ja nicht mehr.inne hat geschrieben:12.03.2019 20:02:43Kann man an das kill noch ein && return hängen um das sleep nicht umsonst abzuwarten?
Was ist von dieser Abfrage dafür zu halten? Also bei einem Namen/nicht numerischen Wert statt kill das killall zu verwenden. Kann man das machen?Kann man ja am Anfang mit pidof bzw. pgrep zu einer PID(können aber auch mehrere PIDS werden) auflösen und mit einer entsprechenden Prüfung ob numerisch oder nicht.Wobei ich gerne noch ein pidof $PID hätte wenn PID nicht numerisch ist...
Code: Alles auswählen
[...]
Zuletzt geändert von Anonymous am 15.03.2019 08:21:05, insgesamt 1-mal geändert.
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
- heisenberg
- Beiträge: 4146
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: Wie beendete man SSH-Tunnel?
Verwendung von killall
Man sollte vielleicht im Hinterkopf behalten, dass killall auf anderen Systemen als (Debian) Linux eine ganz andere Bedeutung hat:
Z. B. OpenSolaris: killall - kill all active processes (https://www.unix.com/man-page/opensolaris/1m/killall/)
Vielleicht doch lieber pkill verwenden?
Tippfehler(_steps statt steps).
Das funktioniert nicht so wie gewünscht. Der kill wird nur ausgeführt wenn der return erfolgreich ist. --> Reihenfolge umkehren...
Aber 100% klar erklären kann ich auch nicht, warum das eine funktioniert und das andere nicht.
---
Anonsten: Testen und schauen ob alle Fälle richtig abgearbeitet werden.
Man sollte vielleicht im Hinterkopf behalten, dass killall auf anderen Systemen als (Debian) Linux eine ganz andere Bedeutung hat:
Z. B. OpenSolaris: killall - kill all active processes (https://www.unix.com/man-page/opensolaris/1m/killall/)
Vielleicht doch lieber pkill verwenden?
Code: Alles auswählen
for((step=1;step<=$_steps;step++));do
Code: Alles auswählen
$kill -0 "$pid" || return && $kill -$signal "$pid"
Code: Alles auswählen
$kill -0 "$pid" && $kill -$signal "$pid" || return
5 war eine willkürliche Wahl.Haben die 5 Sekunden von dir, eine Bewandtnis und nimmt man nicht immer 10?
---
Anonsten: Testen und schauen ob alle Fälle richtig abgearbeitet werden.