Szukałem tego trochę i nie mogę znaleźć nic pomocnego.
Mam komputer z systemem Ubuntu 12.10 skonfigurowany do zawieszenia po 30 minutach bezczynności. Nie chcę tego zmieniać, przez większość czasu działa świetnie.
Chcę tylko wyłączyć automatyczne zawieszanie, jeśli dana aplikacja jest uruchomiona. W jaki sposób mogę to zrobić?
Najbliższą rzeczą, jaką do tej pory znalazłem, jest dodanie skryptu powłoki, w /usr/lib/pm-utils/sleep.d
którym sprawdza, czy aplikacja działa, i zwraca 1, aby wskazać, że należy zapobiec zawieszeniu. Wygląda jednak na to, że system zrezygnuje z automatycznego zawieszania, zamiast próbować ponownie po kolejnych 30 minutach. (O ile mogę stwierdzić, jeśli poruszę myszą, to ponownie uruchomi stoper ponownie.) Jest całkiem prawdopodobne, że aplikacja zakończy się po kilku godzinach, a wolałbym, żeby mój komputer zawiesił się automatycznie, jeśli nie używam w tym momencie . (Więc nie chcę dodawać połączenia do PM-Suspend po zakończeniu aplikacji).
czy to możliwe?
EDYCJA: Jak zauważyłem w jednym z poniższych komentarzy, tak naprawdę chciałem powstrzymać zawieszanie, gdy mój komputer wyświetlał pliki przez NFS; Chciałem tylko skupić się na części „zawieszenia” pytania, ponieważ już miałem pomysł, jak rozwiązać część NFS. Korzystając z pomysłu „xdotool” podanego w jednej z odpowiedzi, wymyśliłem następujący skrypt, który uruchamiam z crona co kilka minut. Nie jest to idealne rozwiązanie, ponieważ zatrzymuje również włączanie się wygaszacza ekranu, ale działa. Muszę rzucić okiem na to, dlaczego „kofeina” nie włącza poprawnie później zawieszenia, to prawdopodobnie mogłabym to zrobić lepiej. W każdym razie wydaje się, że to działa, więc włączam to tutaj na wypadek, gdyby ktoś był zainteresowany.
#!/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
EDYCJA 2: Powyższy skrypt działa, ale dzięki kolejnemu komentarzowi poniżej korzystam teraz z tej pary skryptów, które mają tę zaletę, że pozwalają na uruchomienie wygaszacza ekranu podczas wstrzymywania zawieszenia. Pierwszy to /usr/lib/pm-utils/sleep.d/000nfs-inhibit, który zapobiegnie próbie zawieszenia, jeśli istnieje plik wstrzymania:
#!/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
Druga to zmodyfikowana wersja poprzedniego skryptu nfs-suspend-blocker i nadal powinna być uruchamiana z crona. Teraz jest zgodny ze strategią opisaną w komentarzu poniżej:
#!/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