Làm thế nào để ức chế tạm ngưng?


10

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

Thay vì làm lộn xộn câu hỏi, bạn nên đặt hai giải pháp cho vấn đề như một câu trả lời dưới đây.
Cas

Câu trả lời:


8

Một chương trình để giữ cho máy tính của bạn tỉnh táo là Caffeine . Tôi sẽ tạo một tệp .bash_aliases để gọi caffeine khi mã gốc của bạn được gọi.

alias newname="origcode && caffeine"

Tùy thuộc vào mã mà bạn đang cố gắng để giữ cho máy tính của bạn tỉnh táo, bạn sẽ phải tạo một tập lệnh tùy chỉnh bao gồm việc tiêu diệt caffeine khi mã khác bị dừng. Một số chi tiết về mã cụ thể sẽ giúp.

Cập nhật: Một cách đơn giản hơn là chạy xdotool , có thể được cài đặt cùng sudo apt-get install xdotool. Bạn có thể viết một tập lệnh được gọi khi mã đích của bạn được mở và sau đó sử dụng sleeplệnh trong 29 phút và sau đó chạy xdotool key ahoặc một cái gì đó tùy ý để giữ cho máy tính hoạt động.


2
Đối với xdo, có lẽ tốt hơn là chọn một khóa không thực sự làm điều gì đó. Nhấn shift, ví dụ, sẽ đánh thức màn hình mà không cần gõ trên cửa sổ hoạt động.
Oli

1
Cảm ơn bạn. Tôi đã cố tình che giấu một chút chi tiết trong câu hỏi ban đầu - điều tôi rõ ràng muốn làm là dừng PC của tôi (đang phục vụ nội dung phương tiện qua NFS) trong khi trung tâm truyền thông của tôi đang truy cập nó. Nếu bạn biết một cách cụ thể để giải quyết vấn đề này sẽ rất tuyệt, nếu không tôi có thể thấy một vài con đường sẽ cho phép nó hoạt động thông qua Caffeine (ví dụ: trung tâm truyền thông sẽ ssh vào PC của tôi cứ sau 10 phút và chạy một đoạn script shell. trong 15 phút).
Zorn

1
Tôi đã dùng thử Caffeine và có vẻ như nó hoạt động ngoại trừ khi chương trình đang chạy biến mất, đầu ra Caffeine nói rằng quá trình treo không còn bị ức chế nữa nhưng tôi đã để nó trong hai lần thời gian không hoạt động và mặc dù màn hình đã treo PC. Tôi sẽ chơi xung quanh với điều này hơn nữa, mặc dù tuyến xdo có thể sẽ thuận tiện hơn nữa và tôi sẽ thử nó trước. PS Có cách nào để chèn một dòng mới vào một bình luận không?!
Zorn

5

Nếu

  1. Một tập lệnh trong /usr/lib/pm-utils/s ngủ.d có thể kiểm tra xem ứng dụng có đang chạy hay không và trả về 1 để cho biết rằng nên tạm dừng.
  2. Vấn đề "hệ thống sau đó từ bỏ tạm dừng tự động, thay vì thử lại sau 30 phút nữa" được giải quyết bằng cách di chuyển chuột khởi động lại bộ hẹn giờ (tôi hy vọng tôi đã hiểu đúng ý của bạn về điều này)

vậy thì tại sao không chỉ lắc nhẹ con trỏ chuột sau khi ứng dụng kết thúc.

Để tóm tắt:

  1. Sử dụng ngủ.d để giữ cho hệ thống ngừng hoạt động.
  2. Viết một kịch bản gây cười chuột một lần.
  3. Gọi 'Kịch bản chạy dài && mousejiggle'

Điều này sẽ không cản trở trình bảo vệ màn hình.

Vấn đề duy nhất là sẽ mất 30 phút sau khi quá trình kết thúc khi hệ thống tạm dừng. Đây cũng là trường hợp với giải pháp 'EDIT' của bạn.

PS: Tôi đang tìm kiếm một giải pháp cho một vấn đề tương tự khi tôi biết về xdotool từ trang này. Vì vậy, cảm ơn. Hi vọng điêu nay co ich.


Khéo léo, cảm ơn bạn! Tôi sẽ cho nó đi vào cuối tuần này.
Zorn

Các gợi ý liên quan pm-utilsđã giúp. Lưu ý rằng gói pm-utilscần phải được cài đặt để nó hoạt động - thư mục có thể tồn tại ngay cả khi gói không được cài đặt.
krlmlr

1

Mặc dù EDIT 2 cho phép trình bảo vệ màn hình khởi động và tiếp tục dịch vụ autosuspend khi xóa tệp ức chế, như đã lưu ý ở trên, sẽ mất 30 phút sau khi tệp bị xóa khi hệ thống tạm dừng.

Một giải pháp khả thi là vô hiệu hóa chức năng tự động sàng lọc và tự động treo sẵn có và tự thực hiện chúng và chọn hành vi của bộ hẹn giờ theo yêu cầu. Lệnh xprintidle(bạn có thể phải cài đặt cái này) in số mili giây mà không có hoạt động bàn phím hoặc chuột. Điều này mở ra một số khả năng. Tôi đã triển khai trình quản lý không hoạt động sau đây trong python (không quá nhiều so với scripter bash). Các tính năng bao gồm cài đặt lệnh, thời gian chờ và tệp ức chế (tôi đã gọi nó là khóa) cho trình bảo vệ màn hình và / hoặc tự động gửi. Ngoài ra, còn có tùy chọn để chọn có nên khởi động lại bộ đếm thời gian không hoạt động khi loại bỏ tệp ức chế hay không (hành vi có thể khác nhau đối với tạm dừng và bảo vệ màn hình). Tôi đã cố gắng làm cho việc sử dụng rõ ràng trong các ghi chú nhưng nếu có gì không rõ ràng, hãy hỏi.

#!/usr/bin/python

#Notes:##################

#   1. All TIMEOUTs are specified in seconds
#   2. 0 or negative TIMEOUT disables a particular action.
#   3. If an actionCOMMAND (like pm-suspend) requires 'sudo'ing, make them 'sudo'able without password. Alternatively, you may run this script in sudo mode, and make this script sudoable without password. /ubuntu/159007/specific-sudo-commands-without-password
#   4. 'action'_timer_starts_... option: True - if a lock file is created and then removed, inactivity timer (for that action) restarts at the time of deletion of lock. False - doesn't restart.
#   5. screensaverCOMMAND can be screen-lock (security) or screen-off (power saving) or both. To do both, but at different times (I can't see any reason to do so) extend this script from two actions (screensaver, autosuspend) to three (screen-lock, screen-off, autosuspend).

#########################

import os
import time
import threading
import subprocess

HOME = os.getenv('HOME') + '/'

#Configuration###########

screensaverCOMMAND = "gnome-screensaver-command --lock && xset -display :0.0 +dpms dpms force off"
autosuspendCOMMAND = "gnome-screensaver-command --lock && sudo pm-suspend"

screensaverTIMEOUT = 10*60
autosuspendTIMEOUT = 20*60

screensaverLOCK = HOME + ".inactivitymanager/screensaverLOCK"
autosuspendLOCK = HOME + ".inactivitymanager/autosuspendLOCK"

screensaver_timer_starts_only_after_lockfile_is_deleted = False
autosuspend_timer_starts_only_after_lockfile_is_deleted = False

#########################

def stayOn():
    print "inactivitymanager is running..."
    try:
        while True:
            time.sleep(10)
    except:
        print "Closed."

class inactivity_action(threading.Thread):
    def __init__(self, command, timeout, lock, timer_starts_blah):
        threading.Thread.__init__(self)
        self.daemon = True
        self.command = command
        self.timeout = timeout
        self.lock = lock
        self.timer_starts_blah = timer_starts_blah
    def run(self):
        if not(self.timer_starts_blah):
            while True:
                try:
                    while True:
                        time.sleep(1)
                        f = open(self.lock, 'r')
                        f.close()
                except IOError:
                    xidletime = int(subprocess.Popen('xprintidle', stdout = subprocess.PIPE).communicate()[0])/1000
                    if xidletime > self.timeout:
                        os.system(self.command)
                    else:
                        time.sleep(self.timeout - xidletime + 2)
        else:
            lockremovetime = 0
            while True:
                lockdetected = False
                try:
                    while True:
                        time.sleep(1)
                        f = open(self.lock, 'r')
                        f.close()
                        lockdetected = True
                except IOError: #Will enter this section if/when lockfile is/becomes absent
                    xidletime = int(subprocess.Popen('xprintidle', stdout = subprocess.PIPE).communicate()[0])/1000
                    if lockdetected:
                        lockremovetime = int(time.time())
                    timesincelockremove = int(time.time()) - lockremovetime
                    if min(xidletime, timesincelockremove) > self.timeout:
                        os.system(self.command)

if screensaverTIMEOUT > 0:
    inactivity_screensaver = inactivity_action(screensaverCOMMAND, screensaverTIMEOUT, screensaverLOCK, screensaver_timer_starts_only_after_lockfile_is_deleted)
    inactivity_screensaver.start()

if autosuspendTIMEOUT > 0:
    inactivity_autosuspend = inactivity_action(autosuspendCOMMAND, autosuspendTIMEOUT, autosuspendLOCK, autosuspend_timer_starts_only_after_lockfile_is_deleted)
    inactivity_autosuspend.start()

stayOn()

Sử dụng:

  1. Chỉ cần thêm inactivitymanager &vào .profile hoặc .xsessionrc trong thư mục chính (xem cái nào phù hợp với bạn. Đừng thêm cả hai, hai trường hợp khác của tập lệnh này sẽ chạy đồng thời, một cái gì đó tôi chưa xử lý. Tôi đoán nó nằm trong những chi tiết này rằng các triển khai chính thống át chủ bài tùy chỉnh).
  2. Bạn có thể phải cài đặt xprintidle.

Làm thế nào bây giờ tập tin ức chế được để lại cho trí tưởng tượng của người dùng (nếu tôi tự mình thực hiện một trình nền cho việc này, tôi sẽ đưa nó vào EDIT cho câu trả lời này). Bạn (OP) tất nhiên đã giải quyết nó cho trường hợp của bạn. Một cạm bẫy cần tránh khi cố gắng ngăn chặn việc đình chỉ nhiều hơn một quy trình là xóa tệp khóa khi một quy trình kết thúc trong khi một quy trình khác vẫn đang chạy. Ngoài ra, tập lệnh có thể được chỉnh sửa một chút để ngăn chặn đình chỉ nếu một số tệp tồn tại trong một thư mục cụ thể (một thư mục khóa). Bằng cách này, mỗi quá trình có thể có tập tin khóa riêng của mình.

Ghi chú:

  1. Kịch bản này khá nhẹ trên bộ xử lý và bộ nhớ. Nhưng việc loại bỏ time.s ngủ (1) trong mã có thể gây rắc rối - mặc dù chưa được kiểm tra.
  2. pm-đình chỉ yêu cầu quyền sudo. Để tạm dừng mà không đưa ra kiểm tra mật khẩu Làm cách nào để chạy các lệnh sudo cụ thể mà không cần mật khẩu? . Ngoài ra, bạn có thể chạy tập lệnh này trong chế độ sudo và làm cho tập lệnh này có thể không có mật khẩu (Không phải là vấn đề nếu bạn chạy tập lệnh với quyền root)
  3. Kịch bản có thể gặp sự cố nếu thời gian chờ được đặt ở mức dưới ~ 10 giây (Tôi không kiểm tra chính xác nơi sự cố bắt đầu phải dưới 5, tôi đoán vậy). Điều này có thể được xử lý bằng cách loại bỏ một số thời gian ngủ (1) với chi phí tài nguyên hệ thống. Đừng nghĩ rằng bất cứ ai cũng sẽ cần điều này.
  4. Bởi vì chúng tôi có một bộ xử lý trên bộ hẹn giờ, không cần dùng chuột!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.