Verhindern Sie, dass der Computer in den Ruhezustand wechselt, wenn SSH-Verbindungen bestehen

13

Ich versuche Strom zu sparen, indem ich Desktops in den Suspend-Modus versetze, wenn sie inaktiv sind. Viele Desktops werden jedoch auch von ihren Eigentümern über SSH angesprochen. Es gibt eine Wakeonlan-Lösung, mit der Besitzer den Computer einschalten können. Das Problem besteht jedoch darin, dass der Computer nach 10 Minuten wieder automatisch angehalten wird, obwohl die SSH-Verbindung aktiv ist.

Ich versuche, die aktiven SSH-Sitzungen in die Definitionen der "Aktivität" aufzunehmen.

Die Frage ist, ob dies über das Setzen einer Polkit-Regel möglich ist. Kann man ein Skript erstellen, das vor dem eigentlichen Suspend ausgeführt wird, und es abbrechen, wenn SSH-Sitzungen gefunden werden? Ich brauche einen sauberen, legitimen Weg, um das zu tun. Wenn nicht, dann sind auch hackige Wege willkommen.

Aktuelle naive Hacky-Lösung: Bearbeiten /usr/sbin/pm-suspend:

#check for SSH sessions, and prevent suspending:
if [ "$(who | grep -cv "(:")" -gt 0 ]; then
    echo "SSH session(s) are on. Not suspending."
    exit 1
fi

Dies dient dem Zweck. Ich weiß aber nicht, wann ein Update die Datei überschreibt /usr/sbin/pm-suspend. Ich weiß auch nicht, wie das mit anderen Suspend-Implementierungen wie tuxonice funktioniert.

Bhavin Doshi
quelle
2
Darf ich vorschlagen, grep -cv :0anstatt durch zu gehen wc?
Terdon
1
Eine weitere Idee für mehr Eleganz: Sie können den Aufruf von fallen lassen, [wenn Sie schreiben if who | grep -qv :0; then(vorausgesetzt, Sie haben ein POSIX-konformes grepFormat wie GNU grep).
David Foerster

Antworten:

19

Bis Ubuntu 14.10 (Upstart-basiert)

Schauen Sie sich den Abschnitt „DATEIEN“ an pm-action(8)und suchen Sie danach /etc/pm/sleep.d. Wenn eines dieser Skripte mit einem Exit-Status ungleich Null zurückgegeben wird, wird die Suspendierung verhindert.

Aktualisierte Anweisungen zur Klarheit:

  1. Also erstelle eine Datei /etc/pm/sleep.d/05_ssh_keepawake.

  2. Setzen Sie ein shebang ( #!/bin/sh) und den in der Frage genannten Code in diese Datei.

  3. Legen Sie die Ausführungsberechtigungen fest:

    chmod +x /etc/pm/sleep.d/05_ssh_keepawake
    

Seit Ubuntu 15.04 (systemd-basiert)

systemd verwendet keine pm-utils zur Verwaltung seiner Stromversorgungs-Hooks, sondern verfügt über eine eigene Infrastruktur. Schlafhemmungsprüfungen werden nicht mehr im Schlafmodus ausgeführt, sondern müssen durch die Aktion festgelegt werden, die den Schlafmodus hemmt (siehe 1 ).

Als solches müssten Sie dem Anmelden und Abmelden in der SSH-Sitzung Befehle hinzufügen, die einen Schlaf-Inhibitor bei systemd registrieren (z. B. über systemd-inhibit(1)) und den Inhibitor später freigeben. Wenn jemand weiß, wie man sich in SSH einloggt und ausloggt, würde ich einen Kommentar oder eine Bearbeitung begrüßen, damit wir die relevanten Schritte und Befehle ausarbeiten können.

Der folgende Abschnitt ist in Arbeit - Verwenden Sie ihn nur, wenn Sie wissen, was Sie tun!

Möglicherweise können Sie eine systemd-Einheit schreiben /etc/systemd/system/ssh-inhibt-sleep.service, die sich selbst zur Abhängigkeit von der sleep.targetVerwendung der RequiredByOption macht. Wenn Ihr neues Gerät ausfällt (mit einem Nicht-Null-Ausgangsstatus aus dem aufgerufenen Prozess), wird es eine sleep.targetAktion ausführen und damit die nachfolgende Aktion für den Ruhezustand.

[Unit]
Description=Check for running SSH sessions and, if any, inhibit sleep
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c '! who | grep -qv :0'`

[Install]
RequiredBy=sleep.target

Wie immer müssen Sie systemd units aktivieren, damit sie wirksam werden:

sudo systemctl enable ssh-inhibt-sleep.service

Weitere Infos unter systemd.unit(5)und systemd.service(5).

David Foerster
quelle
das scheint in 18.04 nicht zu funktionieren. Ist das nicht mehr die Lösung?
Michael Jarret
1
@ MichaelJarret: In der Tat. Ich habe meine Frage mit einigen Informationen zur Situation mit systemd aktualisiert.
David Foerster
Ich habe gestern beim Versuch, dies zu klären, Folgendes herausgefunden, konnte aber das vorherige Skript nicht ändern, um die Aufgabe hier
Michael Jarret,
Ich kann meinen Kommentar nicht bearbeiten, aber auch das scheint relevant zu sein
Michael Jarret
1
@MichaelJarret: Ich hatte eine andere Idee, die du ausprobieren könntest. Siehe das Update zu meiner Antwort.
David Foerster