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.
fuente
grep -cv :0
lugar de pasarwc
?[
si escribeif who | grep -qv :0; then
(suponiendo que tenga un POSIX conformegrep
a GNU grep).Respuestas:
Hasta Ubuntu 14.10 (basado en Upstart)
Eche un vistazo
pm-action(8)
y busque/etc/pm/sleep.d
en 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:
Entonces crea un archivo
/etc/pm/sleep.d/05_ssh_keepawake
.Ponga un shebang (
#!/bin/sh
) y el código mencionado en la pregunta en este archivo.Establecer permisos de ejecución en él:
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.service
que dependa delsleep.target
uso de laRequiredBy
opción. Si su nueva unidad falla (con un estado de salida distinto de cero de su proceso invocado), realizarásleep.target
y, por lo tanto, la acción de suspensión posterior.Como siempre, debe activar las unidades systemd para que surtan efecto:
Para más información ver
systemd.unit(5)
ysystemd.service(5)
.fuente