[systemd] beim shutdown bestehende ssh-sessions sauber beenden

07/12/2014 - 15:20 von Marc Haber | Report spam
Hallo,

wenn ich von meinem Arbeitsplatz per ssh auf einem mit systemd
laufenden System eigelogged bin und dieses reboote, fàhrt systemd die
Dienste so schnell herunter, dass nicht mal mehr Zeit für ein RST oder
ein FIN auf der TCP-Session bleibt, über die ich eingelogged bin.

Im Ergebnis bleibt die Shell, in der die ssh-Session làuft, bis zum
Timeout oder bis zur Wiederkehr des Systems auf IP-Ebene (und die
Keepalives des ssh-Clients endlch mit einem TCP RST beantwortet
werden, weil die Gegenseite nichts mehr von der ssh-Session weiß)
hàngen.

Die drei systemd-related Files in Debians Paket openssh-server sehen
so aus:

|[2/500]mh@swivel:~$ cat /lib/systemd/system/ssh.socket
|[Unit]
|Description=OpenBSD Secure Shell server socket
|Before=ssh.service
|Conflicts=ssh.service
|ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
|
|[Socket]
|ListenStream"
|Accept=yes
|
|[Install]
|WantedBy=sockets.target
|[3/501]mh@swivel:~$ cat /lib/systemd/system/ssh.service
|[Unit]
|Description=OpenBSD Secure Shell server
|After=network.target auditd.service
|ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
|
|[Service]
|EnvironmentFile=-/etc/default/ssh
|ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
|ExecReload=/bin/kill -HUP $MAINPID
|KillMode=process
|Restart=on-failure
|
|[Install]
|WantedBy=multi-user.target
|Alias=sshd.service
|[4/502]mh@swivel:~$ cat /lib/systemd/system/ssh@.service
|[Unit]
|Description=OpenBSD Secure Shell server per-connection daemon
|After=auditd.service
|
|[Service]
|EnvironmentFile=-/etc/default/ssh
|ExecStart=-/usr/sbin/sshd -i $SSHD_OPTS
|StandardInput=socket
|[5/503]mh@swivel:~$

Was muss ich wo hinschreiben, damit meine ssh-Sessions beim Reboot des
Servers ein wenig weniger unsauber abgebaut werden als aktuell?

KillMode steht vermutlich deswegen auf "process", damit bestehende
ssh-Sessions bei einem Daemon-restart (z.b. bei Softwareupdates oder
Konfigurationsànderungen) nicht mit getötet werden, was ja auch das
sinnvolle Verhalten ist.

Grüße
Marc
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
 

Lesen sie die antworten

#1 Andreas Kohlbach
07/12/2014 - 23:32 | Warnen spam
Marc Haber wrote on 07. December 2014:

wenn ich von meinem Arbeitsplatz per ssh auf einem mit systemd
laufenden System eigelogged bin und dieses reboote, fàhrt systemd die
Dienste so schnell herunter, dass nicht mal mehr Zeit für ein RST oder
ein FIN auf der TCP-Session bleibt, über die ich eingelogged bin.



Mit welchem Kommando rebootest du? Nur "reboot"?

Im Ergebnis bleibt die Shell, in der die ssh-Session làuft, bis zum
Timeout oder bis zur Wiederkehr des Systems auf IP-Ebene (und die
Keepalives des ssh-Clients endlch mit einem TCP RST beantwortet
werden, weil die Gegenseite nichts mehr von der ssh-Session weiß)
hàngen.



[...]

Man kann doch shutdown selbst eine Verzögerung angeben, und es auch
rebooten lassen statt abschalten. Siehe weiter unten.

| shutdown TIME

Aus der man Page:

| The time string may either be in the format "hh:mm" for
| hour/minutes specifying the time to execute the shutdown at,
| specified in 24h clock format.
|
| Alternatively it may be in the syntax "+m" referring to the
| specified number of minutes m from now. "now" is an alias for
| "+0", i.e. for triggering an immediate shutdown. If no time
| argument is specified, "+1" is implied.

Und ohne Angabe sollte eh 1 Minute Verzögerung sein. Genug Zeit, dass du
dich remote ausloggen kannst.

Vielleicht sollte ein

| shutdown -r +1

den Reboot um eine Minute verzögern (mag ich hier gerade nicht testen ;-).

Sonst den Shutdown Request entweder in einer screen Session absetzen,
oder per at-Job parken.
Andreas

I wish my grass was emo. Then it would cut itself.

Ähnliche fragen