inhabilitar la suspensión y la hibernación en linux (actualizado!)

Después de crear y restaurar las imágenes en los equipos de profesores he recibido quejas sobre cierres inesperados e irrecuperables del sistema en algunas máquinas relacionados con la suspensión de los mismos tras un periodo de inactividad.

Al no poder corregirlo mediante la configuración de energía y/o salva-pantallas en la cuenta de usuario he optado por otra medida más drástica…

No hay nada como una buena gestión de políticas, así que he creado los siguientes archivos (como administrador, obviamente) con el contenido que muestro a continuación:

Inhabilitar suspensión (en memoria)

/etc/polkit-1/localauthority/90-mandatory.d/disable-suspend.pkla

[Disable suspend (upower)]
Identity=unix-user:*
Action=org.freedesktop.upower.suspend
ResultActive=no
ResultInactive=no
ResultAny=no

[Disable suspend (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.suspend
ResultActive=no

[Disable suspend for all sessions (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.suspend-multiple-sessions
ResultActive=no

Inhabilitar hibernación (en disco)

/etc/polkit-1/localauthority/90-mandatory.d/disable-hibernate.pkla

[Disable hibernate (upower)]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=no
ResultInactive=no
ResultAny=no

[Disable hibernate (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate
ResultActive=no

[Disable hibernate for all sessions (logind)]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate-multiple-sessions
ResultActive=no

Una vez creados y reiniciado el equipo desaparecen los botones de los paneles de inicio y cierre de sesión  de cara al usuario, y evita los apagados «automáticos» problemáticos hasta que resuelva el problema. 

A nivel de teclado

Para evitar el problema si el teclado tiene algunas teclas relacionadas para estas funciones, debes ingresar el siguiente comando en una consola con cada usuario del sistema:

gconftool -s /apps/gnome-power-manager/buttons/hibernate -t string interactive

A nivel de comando del sistema

Todavía sería posible desencadenar una suspensión o hibernación desde la línea de comandos. Tenemos que crear un script ejecutable en /etc/pm/sleep.d/ que cancelará cualquier hibernación o suspenderá las acciones.

vim /etc/pm/sleep.d/000cancel-hibernate-suspend

El contenido de este archivo debe ser:

#!/bin/sh
# prevents hibernation and suspend
. "$PM_FUNCTIONS"
case "${1}" in
suspend|hibernate)
inhibit
;;
resume|thaw)
exit 0
;;
esac

Por último haz ese archivo ejecutable:

chmod 0755 /etc/pm/sleep.d/000cancel-hibernate-suspend

A nivel de servicio

Para terminar vamos a tratar de impedir que el sistema desencadene con algún evento los procesos de hibernación o suspensión:

sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

Y si quisiésemos volver a habilitarlos…

sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target