Saya telah mencari sekitar sedikit untuk ini dan sepertinya tidak dapat menemukan sesuatu yang bermanfaat.
Saya memiliki PC saya yang menjalankan Ubuntu 12.10 diatur untuk ditunda setelah 30 menit tidak aktif. Saya tidak ingin mengubahnya, itu berfungsi sangat baik sebagian besar waktu.
Yang ingin saya lakukan adalah menonaktifkan penangguhan otomatis jika aplikasi tertentu sedang berjalan. Bagaimana saya bisa melakukan ini?
Hal terdekat yang saya temukan sejauh ini adalah menambahkan skrip shell /usr/lib/pm-utils/sleep.d
yang memeriksa apakah aplikasi sedang berjalan dan mengembalikan 1 untuk menunjukkan bahwa penangguhan harus dicegah. Tetapi sepertinya sistem kemudian menyerah pada penangguhan secara otomatis, alih-alih mencoba lagi setelah 30 menit. (Sejauh yang saya tahu, jika saya menggerakkan mouse, itu me-restart timer lagi.) Sangat mungkin aplikasi akan selesai setelah beberapa jam, dan saya lebih suka PC saya kemudian ditangguhkan secara otomatis jika saya tidak menggunakan pada titik itu . (Jadi saya tidak ingin menambahkan panggilan ke pm-menangguhkan ketika aplikasi selesai.)
Apakah ini mungkin?
EDIT: Seperti yang saya catat di salah satu komentar di bawah, apa yang sebenarnya saya inginkan adalah untuk menghentikan sementara ketika PC saya melayani file melalui NFS; Saya hanya ingin fokus pada bagian "menangguhkan" dari pertanyaan karena saya sudah punya ide bagaimana menyelesaikan bagian NFS. Menggunakan ide 'xdotool' yang diberikan dalam salah satu jawaban, saya telah membuat skrip berikut yang saya jalankan dari cron setiap beberapa menit. Ini tidak ideal karena menghentikan screensaver juga, tetapi berhasil. Saya perlu melihat mengapa 'kafein' tidak mengaktifkan kembali dengan benar nanti, maka saya mungkin bisa melakukan yang lebih baik. Bagaimanapun, ini sepertinya berhasil, jadi saya memasukkannya di sini kalau-kalau ada orang lain yang tertarik.
#!/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: Skrip di atas berfungsi tetapi berkat komentar lain di bawah ini, saya sekarang menggunakan pasangan skrip ini, yang memiliki keuntungan memungkinkan screensaver untuk menendang sementara saya menghambat penangguhan. Yang pertama adalah /usr/lib/pm-utils/sleep.d/000nfs-inhibit, yang akan mencegah upaya penangguhan jika ada file penghambat:
#!/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
Yang kedua adalah versi modifikasi dari skrip nfs-suspend-blocker sebelumnya dan masih harus dijalankan dari cron. Sekarang mengikuti strategi yang dijelaskan dalam komentar di bawah:
#!/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