He buscado un poco por esto y parece que no puedo encontrar nada útil.
Tengo mi PC con Ubuntu 12.10 configurado para suspender después de 30 minutos de inactividad. No quiero cambiar eso, funciona muy bien la mayor parte del tiempo.
Lo que sí quiero hacer es desactivar la suspensión automática si se está ejecutando una aplicación en particular. ¿Cómo puedo hacer esto?
Lo más cercano que he encontrado hasta ahora es agregar un script de shell en el /usr/lib/pm-utils/sleep.d
que verifica si la aplicación se está ejecutando y devuelve 1 para indicar que se debe evitar la suspensión. Pero parece que el sistema abandona la suspensión automática, en lugar de intentarlo nuevamente después de otros 30 minutos. (Por lo que puedo decir, si muevo el mouse, eso reinicia el temporizador nuevamente.) Es muy probable que la aplicación termine después de un par de horas, y prefiero que mi PC se suspenda automáticamente si no estoy usando en ese punto . (Por lo tanto, no quiero agregar una llamada a pm-suspend cuando finalice la aplicación).
es posible?
EDITAR: Como señalé en uno de los comentarios a continuación, lo que realmente quería era inhibir la suspensión cuando mi PC estaba sirviendo archivos a través de NFS; Solo quería centrarme en la parte "suspender" de la pregunta porque ya tenía una idea de cómo resolver la parte NFS. Utilizando la idea 'xdotool' dada en una de las respuestas, se me ocurrió el siguiente script que ejecuto desde cron cada pocos minutos. No es ideal porque también detiene el protector de pantalla, pero funciona. Necesito echar un vistazo a por qué la 'cafeína' no vuelve a habilitar correctamente la suspensión más adelante, entonces probablemente podría hacerlo mejor. De todos modos, esto parece funcionar, así que lo incluyo aquí en caso de que alguien más esté interesado.
#!/bin/bash
# If the output of this function changes between two successive runs of this
# script, we inhibit auto-suspend.
function check_activity()
{
/usr/sbin/nfsstat --server --list
}
# Prevent the automatic suspend from kicking in.
function inhibit_suspend()
{
# Slightly jiggle the mouse pointer about; we do a small step and
# reverse step to try to stop this being annoying to anyone using the
# PC. TODO: This isn't ideal, apart from being a bit hacky it stops
# the screensaver kicking in as well, when all we want is to stop
# the PC suspending. Can 'caffeine' help?
export DISPLAY=:0.0
xdotool mousemove_relative --sync -- 1 1
xdotool mousemove_relative --sync -- -1 -1
}
LOG="$HOME/log/nfs-suspend-blocker.log"
ACTIVITYFILE1="$HOME/tmp/nfs-suspend-blocker.current"
ACTIVITYFILE2="$HOME/tmp/nfs-suspend-blocker.previous"
echo "Started run at $(date)" >> "$LOG"
if [ ! -f "$ACTIVITYFILE1" ]; then
check_activity > "$ACTIVITYFILE1"
exit 0;
fi
/bin/mv "$ACTIVITYFILE1" "$ACTIVITYFILE2"
check_activity > "$ACTIVITYFILE1"
if cmp --quiet "$ACTIVITYFILE1" "$ACTIVITYFILE2"; then
echo "No activity detected since last run" >> "$LOG"
else
echo "Activity detected since last run; inhibiting suspend" >> "$LOG"
inhibit_suspend
fi
EDITAR 2: el script anterior funciona, pero gracias a otro comentario a continuación, ahora estoy usando este par de scripts, que tienen la ventaja de permitir que el protector de pantalla se active mientras inhibo la suspensión. El primero es /usr/lib/pm-utils/sleep.d/000nfs-inhibit, que evitará un intento de suspensión si existe un archivo de inhibición:
#!/bin/sh
LOG="/home/zorn/log/nfs-suspend-blocker.log"
INHIBITFILE="/home/zorn/tmp/nfs-suspend-blocker.inhibit"
echo "$0: Started run at $(date), arguments: $*" >> "$LOG"
if [ "$1" = "suspend" ] && [ -f "$INHIBITFILE" ]; then
echo "$0: Inhibiting suspend" >> "$LOG"
exit 1
fi
exit 0
La segunda es una versión modificada del script nfs-suspend-blocker anterior y aún debe ejecutarse desde cron. Ahora sigue la estrategia descrita en el comentario a continuación:
#!/bin/bash
# This works in tandem with /usr/lib/pm-utils/sleep.d/000nfs-inhibit, which
# will prevent a suspend occurring if $INHIBITFILE is present. Once it prevents
# a suspend, it appears that it requires some "user activity" to restart the
# timer which will cause a subsequent suspend attempt, so in addition to
# creating or removing $INHIBITFILE this script also jiggles the mouse after
# removing the file to restart the timer.
# If the output of this function changes between two successive runs of this
# script, we inhibit auto-suspend.
function check_activity()
{
/usr/sbin/nfsstat --server --list
}
# Slightly jiggle the mouse pointer about; we do a small step and reverse step
# to try to stop this being annoying to anyone using the PC.
function jiggle_mouse()
{
export DISPLAY=:0.0
xdotool mousemove_relative --sync -- 1 1
xdotool mousemove_relative --sync -- -1 -1
}
LOG="$HOME/log/nfs-suspend-blocker.log"
ACTIVITYFILE1="$HOME/tmp/nfs-suspend-blocker.current"
ACTIVITYFILE2="$HOME/tmp/nfs-suspend-blocker.previous"
INHIBITFILE="$HOME/tmp/nfs-suspend-blocker.inhibit"
echo "$0: Started run at $(date)" >> "$LOG"
if [ ! -f "$ACTIVITYFILE1" ]; then
check_activity > "$ACTIVITYFILE1"
exit 0;
fi
/bin/mv "$ACTIVITYFILE1" "$ACTIVITYFILE2"
check_activity > "$ACTIVITYFILE1"
if cmp --quiet "$ACTIVITYFILE1" "$ACTIVITYFILE2"; then
echo "$0: No activity detected since last run" >> "$LOG"
if [ -f "$INHIBITFILE" ]; then
echo "$0: Removing suspend inhibit file and jiggling mouse" >> "$LOG"
/bin/rm "$INHIBITFILE"
jiggle_mouse
fi
else
echo "$0: Activity detected since last run; inhibiting suspend" >> "$LOG"
touch "$INHIBITFILE"
fi