Я немного обыскал это и не могу найти ничего полезного.
Мой компьютер работает под управлением Ubuntu 12.10 и настроен на приостановку после 30 минут бездействия. Я не хочу это менять, большую часть времени это прекрасно работает.
Что я хочу сделать, так это отключить автоматическую приостановку, если работает конкретное приложение. Как я могу это сделать?
Самое близкое, что я нашел на данный момент, - это добавить сценарий оболочки, в /usr/lib/pm-utils/sleep.d
котором проверяется, запущено ли приложение, и возвращает 1, чтобы указать, что приостановка должна быть предотвращена. Но похоже, что система перестает автоматически приостанавливаться, вместо повторных попыток через 30 минут. (Насколько я могу судить, если я переместлю мышь, это снова перезапустит таймер.) Вполне вероятно, что приложение завершит работу через пару часов, и я бы предпочел, чтобы мой компьютер автоматически приостанавливался, если я не использую это в тот момент . (Поэтому я не хочу добавлять вызов pm-suspend после завершения приложения.)
Это возможно?
РЕДАКТИРОВАТЬ: Как я отметил в одном из комментариев ниже, что я действительно хотел, чтобы запретить приостановку, когда мой компьютер обслуживал файлы через 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
РЕДАКТИРОВАТЬ 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