私はこれについて少し検索しましたが、役立つものを見つけることができないようです。
Ubuntu 12.10を実行しているPCで、30分間何も操作しないと一時停止するように設定しています。私はそれを変えたくありません、それはほとんどの場合うまくいきます。
特定のアプリケーションが実行されている場合、自動サスペンドを無効にしたいのですが。これどうやってするの?
これまでに見つけた最も近いものは/usr/lib/pm-utils/sleep.d
、アプリケーションが実行されているかどうかをチェックし、1を返して中断を防止する必要があることを示すシェルスクリプトを追加することです。しかし、システムは、その後30分後に再試行するのではなく、自動的に中断することをあきらめるように見えます。(私が知る限り、マウスを動かすと、タイマーが再起動します。)アプリケーションは数時間後に終了する可能性が高く、使用していない場合はPCを自動的に一時停止したほうがよいでしょう。その時点でそれ。(したがって、アプリケーションの終了時にpm-suspendへの呼び出しを追加したくありません。)
これは可能ですか?
編集:以下のコメントの1つで述べたように、実際に必要だったのは、PCがNFS経由でファイルを提供しているときにサスペンドを禁止することでした。NFSの部分を解決する方法をすでに考えていたので、質問の「サスペンド」の部分に焦点を当てたかっただけです。回答の1つにある「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:上記のスクリプトは機能しますが、以下の別のコメントのおかげで、私はこのスクリプトのペアを使用しています。これは、サスペンドを禁止している間、スクリーンセーバーが起動できるという利点があります。1つ目は/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
2つ目は、以前の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