Ich habe ein bisschen danach gesucht und kann anscheinend nichts hilfreiches finden.
Ich habe meinen PC mit Ubuntu 12.10 so eingerichtet, dass er nach 30 Minuten Inaktivität angehalten wird. Ich möchte das nicht ändern, es funktioniert die meiste Zeit großartig.
Ich möchte das automatische Anhalten deaktivieren, wenn eine bestimmte Anwendung ausgeführt wird. Wie kann ich das machen?
Das Nächste, was ich bisher gefunden habe, ist das Hinzufügen eines Shell-Skripts, in /usr/lib/pm-utils/sleep.d
dem überprüft wird, ob die Anwendung ausgeführt wird, und 1 zurückgegeben wird, um anzugeben, dass das Anhalten verhindert werden soll. Es sieht jedoch so aus, als würde das System das automatische Anhalten aufgeben, anstatt es nach weiteren 30 Minuten erneut zu versuchen. (Soweit ich das beurteilen kann, startet der Timer beim Bewegen der Maus erneut.) Es ist sehr wahrscheinlich, dass die Anwendung nach ein paar Stunden beendet wird. Ich möchte lieber, dass mein PC automatisch angehalten wird, wenn ich ihn nicht verwende es an diesem Punkt . (Daher möchte ich pm-suspend nach Abschluss der Anwendung nicht mehr aufrufen.)
Ist das möglich?
BEARBEITEN: Wie ich in einem der folgenden Kommentare festgestellt habe, wollte ich eigentlich das Suspendieren verhindern, wenn mein PC Dateien über NFS bereitstellt. Ich wollte mich nur auf den "Suspend" -Teil der Frage konzentrieren, da ich bereits eine Idee hatte, wie der NFS-Teil gelöst werden kann. Unter Verwendung der in einer der Antworten angegebenen 'xdotool'-Idee habe ich das folgende Skript erstellt, das ich alle paar Minuten von cron aus starte. Es ist nicht ideal, weil es den Bildschirmschoner ebenfalls davon abhält, einzuschalten, aber es funktioniert. Ich muss einen Blick darauf werfen, warum 'Koffein' das Suspendieren später nicht richtig wieder aktiviert, dann könnte ich es wahrscheinlich besser machen. Wie auch immer, das scheint zu funktionieren, also füge ich es hier ein, falls jemand anderes interessiert ist.
#!/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
BEARBEITEN 2: Das obige Skript funktioniert, aber dank eines weiteren Kommentars unten verwende ich jetzt dieses Skriptpaar, das den Vorteil hat, dass der Bildschirmschoner aktiviert werden kann, während ich das Suspendieren hemme. Das erste ist /usr/lib/pm-utils/sleep.d/000nfs-inhibit, wodurch ein Suspendierungsversuch verhindert wird, wenn eine Sperrdatei vorhanden ist:
#!/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
Die zweite ist eine modifizierte Version des vorherigen nfs-suspend-blocker-Skripts und sollte weiterhin von cron ausgeführt werden. Es folgt nun der im Kommentar unten beschriebenen Strategie:
#!/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