Я трохи пошукав це, і не можу знайти щось корисне.
У мене на комп'ютері під керуванням Ubuntu 12.10 налаштовано призупинення роботи після 30 хвилин бездіяльності. Я не хочу цього змінювати, це працює чудово більшу частину часу.
Що я хочу зробити - це відключити автоматичне призупинення роботи, якщо працює певна програма. Як я можу це зробити?
Найближче, що я знайшов поки що, - це додати скрипт оболонки, у /usr/lib/pm-utils/sleep.d
якому перевіряється, чи працює програма та повертає 1, щоб вказати, що призупинення потрібно запобігти. Але схоже, що система потім відмовляється від зупинки автоматично, замість того, щоб повторити спробу ще через 30 хвилин. (Наскільки я можу сказати, якщо я переміщу мишку, вона знову перезапустить таймер.) Цілком ймовірно, що програма закінчиться через пару годин, і я вважаю за краще, щоб мій ПК автоматично призупинився, якщо я не використовую це в той момент . (Тому я не хочу додавати дзвінок у вечірню зупинку, коли програма закінчиться.)
Чи можливо це?
EDIT: Як я зазначив в одному з коментарів нижче, те, що я насправді хотів, було призупинити призупинення, коли мій ПК обслуговував файли через NFS; Я просто хотів зосередитись на «призупиненні» частини питання, тому що я вже мав уявлення, як вирішити частину NFS. Використовуючи ідею "xdotool", дану в одній з відповідей, я придумав наступний сценарій, який я бігаю з cron кожні кілька хвилин. Це не ідеально, оскільки він також зупиняє заставку заставки, але це працює. Мені потрібно ознайомитись з тим, чому «кофеїн» не може повторно ввімкнути призупинення пізніше, тоді, можливо, я міг би зробити і краще. У будь-якому випадку це, здається, працює, тому я включаю його сюди на випадок, коли хтось зацікавиться.
#!/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: Сценарій, описаний вище, працює, але завдяки іншому коментарю нижче, я зараз використовую цю пару сценаріїв, які мають перевагу дозволяти заставці запускати, поки я гальмую призупинення. Перший - /usr/lib/pm-utils/sleep.d/000nfs-inhibit, що запобігає спробі призупинення, якщо існує файл гальмування:
#!/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
Другий - це модифікована версія попереднього сценарію nfs-suspend-blocker і все ще повинен запускатися з cron. Тепер вона випливає із стратегії, викладеної в коментарі нижче:
#!/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