Impedire la sospensione della macchina quando le connessioni SSH sono attive


13

Sto cercando di risparmiare energia passando i desktop alla modalità di sospensione quando sono inattivi. Ma molti desktop sono accessibili anche tramite SSH dai loro proprietari. Esiste una soluzione wakeonlan implementata per consentire ai proprietari di accendere la macchina, ma il problema è che le macchine si sospenderanno automaticamente tra 10 minuti, anche se la connessione SSH è attiva.

Quello che sto cercando di fare è includere le sessioni SSH attive nelle definizioni "attività".

La domanda è: si può fare impostando una regola polkit? Può essere fatto inserendo uno script che viene eseguito prima della sospensione effettiva e lo interrompe se vengono rilevate sessioni SSH? Ho bisogno di un modo pulito e legittimo per farlo. Altrimenti, anche i modi confusi sono i benvenuti.

La soluzione ingenua hacky attuale: modifica /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

Questo serve allo scopo. Ma non so quando un aggiornamento sovrascriverà il file /usr/sbin/pm-suspend. Inoltre non so come funzionerà con altre implementazioni di sospensione come tuxonice.


2
Posso suggerire di utilizzare grep -cv :0invece di passare wc?
terdon,

1
Un'altra idea per maggiore eleganza: è possibile eliminare l'invocazione di [se si scrive if who | grep -qv :0; then(supponendo che si abbia un POSIX conforme grepcome GNU grep).
David Foerster,

Risposte:


19

Fino a Ubuntu 14.10 (basato su Upstart)

Dai un'occhiata pm-action(8)e cerca /etc/pm/sleep.dnella sezione "FILE". Se uno di questi script ritorna con uno stato di uscita diverso da zero, la sospensione viene impedita.

Istruzioni aggiornate per chiarezza:

  1. Quindi crea un file /etc/pm/sleep.d/05_ssh_keepawake.

  2. Inserisci un shebang ( #!/bin/sh) e il codice menzionato nella domanda in questo file.

  3. Impostare le autorizzazioni di esecuzione su di esso:

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

Da Ubuntu 15.04 (basato su systemd)

systemd non usa pm-utils per gestire i suoi hook di stato di alimentazione ma ha una propria infrastruttura allo stesso fine. I controlli degli inibitori del sonno non vengono più eseguiti durante il sonno ma devono essere impostati dall'azione che inibisce il sonno (vedere 1 ).

Come tale dovresti aggiungere comandi alla sessione SSH di accesso e disconnessione che registra un inibitore del sonno con systemd (ad es. Via systemd-inhibit(1)) e successivamente rilascia l'inibitore. Se qualcuno sa come connettersi e disconnettersi da SSH, gradirei un commento o una modifica in modo da poter elaborare i relativi passaggi e comandi.

La sezione seguente è in fase di elaborazione: utilizzala solo quando sai cosa stai facendo!

Potresti essere in grado di scrivere un'unità systemd /etc/systemd/system/ssh-inhibt-sleep.serviceche si rende dipendente sleep.targetdall'uso RequiredBydell'opzione. Se la tua nuova unità fallisce (con uno stato di uscita diverso da zero dal suo processo invocato), effettuerà sleep.targete quindi la successiva azione di sospensione.

[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

Come sempre è necessario attivare le unità systemd affinché abbiano effetto:

sudo systemctl enable ssh-inhibt-sleep.service

Per maggiori informazioni vedi systemd.unit(5)e systemd.service(5).


questo non sembra funzionare nel 18.04. Non è più questa la soluzione?
Michael Jarret,

1
@MichaelJarret: Davvero. Ho aggiornato la mia domanda con alcune informazioni sulla situazione con systemd.
David Foerster,

Ho trovato quanto segue mentre cercavo di risolverlo ieri, ma non ho potuto modificare lo script precedente per fare il lavoro qui
Michael Jarret,

Non posso modificare il mio commento, ma anche questo sembra rilevante
Michael Jarret,

1
@MichaelJarret: ho avuto un'altra idea che potresti provare. Vedi l'aggiornamento alla mia risposta.
David Foerster,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.