Ho cercato un po 'per questo e non riesco a trovare nulla di utile.
Ho il mio PC con Ubuntu 12.10 impostato per la sospensione dopo 30 minuti di inattività. Non voglio cambiarlo, funziona alla grande per la maggior parte del tempo.
Quello che voglio fare è disabilitare la sospensione automatica se una particolare applicazione è in esecuzione. Come posso fare questo?
La cosa più vicina che ho trovato finora è quella di aggiungere uno script di shell in /usr/lib/pm-utils/sleep.d
cui verifica se l'applicazione è in esecuzione e restituisce 1 per indicare che la sospensione dovrebbe essere impedita. Ma sembra che il sistema abbia rinunciato a sospendere automaticamente, invece di riprovare dopo altri 30 minuti. (Per quanto ne so, se muovo il mouse, questo riavvia nuovamente il timer.) È molto probabile che l'applicazione finisca dopo un paio d'ore, e preferirei che il mio PC si sospendesse automaticamente se non sto usando a quel punto . (Quindi non voglio aggiungere una chiamata a pm-suspend al termine dell'applicazione.)
È possibile?
EDIT: Come ho notato in uno dei commenti qui sotto, quello che volevo veramente era inibire la sospensione quando il mio PC serviva file su NFS; Volevo solo concentrarmi sulla parte "sospendi" della domanda perché avevo già un'idea di come risolvere la parte NFS. Usando l'idea 'xdotool' fornita in una delle risposte, ho escogitato il seguente script che eseguo da cron ogni pochi minuti. Non è l'ideale perché arresta anche lo screensaver, ma funziona. Devo vedere perché la "caffeina" non riattiva correttamente la sospensione in seguito, quindi probabilmente potrei fare di meglio. Ad ogni modo, questo sembra funzionare, quindi lo includo qui nel caso qualcun altro fosse interessato.
#!/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
EDIT 2: lo script sopra funziona ma grazie ad un altro commento qui sotto, sto usando questa coppia di script, che hanno il vantaggio di consentire allo screensaver di dare il via mentre inibisco la sospensione. Il primo è /usr/lib/pm-utils/sleep.d/000nfs-inhibit, che impedirà un tentativo di sospensione se esiste un file di inibizione:
#!/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 seconda è una versione modificata del precedente script nfs-suspend-blocker e dovrebbe comunque essere eseguita da cron. Segue ora la strategia delineata nel commento qui sotto:
#!/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