Tôi đã tìm kiếm một chút cho điều này và dường như không thể tìm thấy bất cứ điều gì hữu ích.
Tôi có PC chạy Ubuntu 12.10 được thiết lập để tạm dừng sau 30 phút không hoạt động. Tôi không muốn thay đổi điều đó, nó hoạt động tốt hầu hết thời gian.
Những gì tôi muốn làm là vô hiệu hóa hệ thống treo tự động nếu một ứng dụng cụ thể đang chạy. Tôi có thể làm cái này như thế nào?
Điều gần nhất mà tôi tìm thấy cho đến nay là thêm một tập lệnh shell trong /usr/lib/pm-utils/sleep.d
đó kiểm tra xem ứng dụng có đang chạy hay không và trả về 1 để chỉ ra rằng nên tạm dừng. Nhưng có vẻ như hệ thống sau đó từ bỏ việc tạm dừng tự động, thay vì thử lại sau 30 phút nữa. (Theo như tôi có thể nói, nếu tôi di chuyển chuột, mà khởi động lại bộ đếm thời gian một lần nữa.) Đó là khá nhiều khả năng ứng dụng sẽ kết thúc sau một vài giờ, và tôi thà máy tính của tôi sau đó lơ lửng tự động nếu tôi không sử dụng nó tại thời điểm đó . (Vì vậy, tôi không muốn thêm một cuộc gọi để tạm dừng khi ứng dụng kết thúc.)
Điều này có thể không?
EDIT: Như tôi đã lưu ý trong một trong những ý kiến dưới đây, điều tôi thực sự muốn là ngăn chặn sự đình chỉ khi PC của tôi đang phục vụ các tệp qua NFS; Tôi chỉ muốn tập trung vào phần "đình chỉ" của câu hỏi vì tôi đã có ý tưởng làm thế nào để giải quyết phần NFS. Sử dụng ý tưởng 'xdotool' được đưa ra trong một trong những câu trả lời, tôi đã đưa ra kịch bản sau đây mà tôi chạy từ cron cứ sau vài phút. Điều đó không lý tưởng bởi vì nó cũng dừng trình bảo vệ màn hình, nhưng nó vẫn hoạt động. Tôi cần phải xem tại sao 'caffeine' không kích hoạt lại chính xác việc đình chỉ sau này, thì tôi có thể làm tốt hơn. Dù sao, điều này dường như hoạt động, vì vậy tôi bao gồm nó ở đây trong trường hợp bất cứ ai khác quan tâm.
#!/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: Kịch bản trên hoạt động nhưng nhờ một bình luận khác bên dưới, tôi hiện đang sử dụng cặp kịch bản này, có lợi thế là cho phép trình bảo vệ màn hình khởi động trong khi tôi đang ngăn chặn. Đầu tiên là /usr/lib/pm-utils/s ngủ.d/000nfs-inhibit, điều này sẽ ngăn chặn nỗ lực tạm ngưng nếu tồn tại tệp ức chế:
#!/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
Thứ hai là một phiên bản sửa đổi của tập lệnh nfs-đình chỉ-chặn trước đó và vẫn nên được chạy từ cron. Bây giờ nó đi theo chiến lược được nêu trong bình luận dưới đây:
#!/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