Evite que la máquina duerma cuando las conexiones SSH están activadas

13

Estoy tratando de ahorrar energía cambiando los escritorios al modo de suspensión cuando están inactivos. Pero sus propietarios también acceden a muchas computadoras de escritorio a través de SSH. Hay una solución de wakeonlan implementada para permitir a los propietarios encender la máquina, pero el problema es que las máquinas volverán a suspenderse automáticamente en 10 minutos, aunque la conexión SSH esté activada.

Lo que intento hacer es incluir las sesiones SSH activas en las definiciones de "actividad".

La pregunta es ¿se puede hacer estableciendo una regla polkit? ¿Se puede hacer colocando un script que se ejecute antes de la suspensión real y lo anule si se encuentran sesiones SSH? Necesito una forma legítima y limpia de hacer esto. Si no es así, entonces las formas hacky también son bienvenidas.

Solución ingenua hacky actual: editar /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

Esto sirve el propósito. Pero no sé cuándo una actualización sobrescribirá el archivo /usr/sbin/pm-suspend. Tampoco sé cómo funcionará esto con otras implementaciones de suspensión como tuxonice.

Bhavin Doshi
fuente
2
¿Puedo sugerir usar en grep -cv :0lugar de pasar wc?
terdon
1
Otra idea para una mayor elegancia: puede descartar la invocación de [si escribe if who | grep -qv :0; then(suponiendo que tenga un POSIX conforme grepa GNU grep).
David Foerster

Respuestas:

19

Hasta Ubuntu 14.10 (basado en Upstart)

Eche un vistazo pm-action(8)y busque /etc/pm/sleep.den la sección "ARCHIVOS". Si uno de estos scripts regresa con un estado de salida distinto de cero, se evita la suspensión.

Instrucciones actualizadas para mayor claridad:

  1. Entonces crea un archivo /etc/pm/sleep.d/05_ssh_keepawake.

  2. Ponga un shebang ( #!/bin/sh) y el código mencionado en la pregunta en este archivo.

  3. Establecer permisos de ejecución en él:

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

Desde Ubuntu 15.04 (basado en systemd)

systemd no usa pm-utils para administrar sus enlaces de estado de energía, pero tiene su propia infraestructura para el mismo extremo. Los verificadores de inhibidores del sueño ya no se ejecutan durante el sueño, sino que deben establecerse mediante la acción que inhibe el sueño (ver 1 ).

Como tal, tendría que agregar comandos al inicio y cierre de sesión de la sesión SSH que registra un inhibidor del sueño con systemd (por ejemplo, vía systemd-inhibit(1)) y luego libera el inhibidor. Si alguien sabe cómo conectarse al inicio y cierre de sesión de SSH, agradecería un comentario o edición para que podamos resolver los pasos y comandos relevantes.

La siguiente sección es un trabajo en progreso. ¡Úselo solo cuando sepa lo que está haciendo!

Es posible que pueda escribir una unidad systemd /etc/systemd/system/ssh-inhibt-sleep.serviceque dependa del sleep.targetuso de la RequiredByopción. Si su nueva unidad falla (con un estado de salida distinto de cero de su proceso invocado), realizará sleep.targety, por lo tanto, la acción de suspensión posterior.

[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

Como siempre, debe activar las unidades systemd para que surtan efecto:

sudo systemctl enable ssh-inhibt-sleep.service

Para más información ver systemd.unit(5)y systemd.service(5).

David Foerster
fuente
Esto no parece funcionar en 18.04. ¿Ya no es esta la solución?
Michael Jarret
1
@MichaelJarret: De hecho. Actualicé mi pregunta con información sobre la situación con systemd.
David Foerster
Encontré lo siguiente mientras intentaba solucionar esto ayer, pero no pude modificar el guión anterior para hacer el trabajo aquí
Michael Jarret
No puedo editar mi comentario, pero esto también parece relevante
Michael Jarret
1
@ MichaelJarret: Tenía otra idea que podrías probar. Vea la actualización de mi respuesta.
David Foerster