Как подавить, приостанавливают временно?

Я искал вокруг немного это и, может казаться, ничто не нахожу полезным.

У меня есть свой ПК, увеличивающий набор Ubuntu 12.10 для приостановки после 30 минут неактивности. Я не хочу изменять это, это работает отлично большую часть времени.

То, что я действительно хочу сделать, отключают автоматическое, приостанавливают, если конкретное приложение работает. Как я могу сделать это?

Самая близкая вещь, которую я нашел до сих пор, состоит в том, чтобы включить сценарий оболочки /usr/lib/pm-utils/sleep.d то, которое проверяет, работает ли приложение и возвращается 1, чтобы указать, что приостанавливают, должно быть предотвращено. Но похоже, что система затем разочаровывается в приостановке автоматически, вместо того, чтобы попробовать еще раз еще после 30 минут. (Насколько я могу сказать, если я перемещаю мышь, которая перезапускает таймер снова.) Довольно вероятно, что приложение закончится после нескольких часов, и я быть бы свой ПК, затем приостановленный автоматически, если я не использую его в той точке. (Таким образом, я не хочу добавлять, что вызов к пополудни - приостанавливает, когда приложение заканчивается.)

Действительно ли это возможно?

Править: Как я отметил в одном из комментариев ниже, что я на самом деле хотел, должен был запретить, приостанавливают, когда мой ПК служил файлам по NFS; я просто хотел сфокусироваться на "приостановить" части вопроса, потому что у меня уже была идея, как решить часть NFS. Используя 'xdotool' идею, данную в одном из ответов, я придумал следующий скрипт, который я запускаю от крона каждые несколько минут. Это не идеально, потому что это останавливает экранную заставку, умирающую также, но это действительно работает. Я должен взглянуть на то, почему 'кофеин' правильно не повторно включает, приостанавливают позже, затем я мог, вероятно, добиться большего успеха. Так или иначе это, действительно кажется, работает, таким образом, я включаю его здесь в случае, если кому-либо еще интересно.

#!/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 сценария и должно все еще быть выполнено от крона. Это теперь следует стратегии, обрисованной в общих чертах в комментарии ниже:

#!/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
10
задан 10 November 2017 в 23:58

4 ответа

Если

  1. Сценарий в /usr/lib/pm-utils/sleep.d может проверить, запущено ли приложение, и возвращает 1, чтобы указать, что приостановка должна быть предотвращена.
  2. Проблема «система перестает автоматически приостанавливаться, вместо повторных попыток через 30 минут», решается перемещением мыши, которая снова запускает таймер (надеюсь, я правильно понял, что вы имеете в виду под этим)

тогда почему бы просто не трясти указателем мыши после завершения работы приложения.

Подведем итог:

  1. Используйте sleep.d, чтобы система не зависала.
  2. Напишите скрипт, который покачивает мышь один раз.
  3. Call 'Long-running-script & amp; & amp; mousejiggle '

Это не помешает заставке.

Единственная проблема заключается в том, что пройдет 30 минут после завершения процесса, когда система приостановит работу. Это относится и к вашему решению «РЕДАКТИРОВАТЬ».

PS: я искал решение похожей проблемы, когда узнал о xdotool на этой странице. Тогда спасибо. Надеюсь, это поможет.

0
ответ дан 10 November 2017 в 23:58

Программа для поддержания бодрствования вашего компьютера - Кофеин . Я хотел бы создать файл .bash_aliases, чтобы он также вызывал кофеин при вызове вашего исходного кода.

alias newname="origcode && caffeine"

В зависимости от того, какой код вы пытаетесь держать на своем компьютере, вам нужно будет создать собственный сценарий, который включает в себя уничтожение кофеина, когда другой код остановлен. Некоторые подробности о конкретном коде помогут.

Обновление: Более простой способ - запустить xdotool , который можно установить с помощью sudo apt-get install xdotool. Вы можете написать скрипт, который вызывается при открытии целевого кода, а затем использовать команду sleep в течение 29 минут, а затем запустить xdotool key a или что-то произвольное, чтобы компьютер не спал.

0
ответ дан 10 November 2017 в 23:58

Хотя EDIT 2 позволяет активировать заставку и возобновляет службу автоматического приостановления при удалении файла запрета, как отмечалось выше, через 30 минут после удаления файла система будет приостановлена.

Одним из возможных решений является отключение встроенной функции автоэкранной заставки и автоматического приостановления, а также их реализация самостоятельно и выбор поведения таймера по мере необходимости. Команда xprintidle (возможно, вам придется установить это) печатает количество миллисекунд, в течение которых не было действия клавиатуры или мыши. Это открывает несколько возможностей. Я реализовал следующий менеджер неактивности в python (не слишком много скриптов bash). Возможности включают в себя настройку команды, тайм-аут и запретить файл (я назвал это блокировкой) для заставки и / или автоматической приостановки. Кроме того, есть возможность выбрать, должен ли таймер неактивности перезапускаться при удалении запрещающего файла или нет (поведение может быть различным для приостановки и хранителя экрана). Я постарался прояснить использование в примечаниях, но если что-то неясно, спросите.

#!/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. https://askubuntu.com/questions/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()

Использование:

  1. Просто добавьте inactivitymanager & в .profile или .xsessionrc в домашнем каталоге (посмотрите, какой из них работает для вас. Не добавляйте в обоих, иначе два экземпляра этот сценарий будет выполняться одновременно, что я не обработал. Я полагаю, что именно в этих деталях основные реализации имеют преимущество перед пользовательскими). ​​
  2. Возможно, вам придется установить xprintidle.

Как туда попадает файл запрета, пока остается на усмотрение пользователя (если я заставлю себя реализовать демон для этого, я добавлю это в РЕДАКТИРОВАТЬ к этому ответу). Вы (OP), конечно, решили это для своего случая. Одна из ловушек, которую следует избегать при попытке запретить приостановку для более чем одного процесса, - это удаление файла блокировки, когда один процесс завершается, а другой еще работает. Кроме того, сценарий может быть слегка отредактирован, чтобы запретить приостановку, если какой-либо файл существует в определенном каталоге (каталог блокировки). Таким образом, каждый процесс может иметь свой собственный файл блокировки.

Примечания:

  1. Этот скрипт довольно легкий для процессора и памяти. Но удаление time.sleep (1) в коде может вызвать проблемы - пока не проверял.
  2. pm-suspend требует разрешения sudo. Для pm-suspend без предоставления пароля извлечение Как выполнить определенные команды sudo без пароля? . В качестве альтернативы вы можете запустить этот сценарий в режиме sudo и сделать этот сценарий пригодным для использования без пароля (не проблема, если вы запускаете сценарий от имени пользователя root)
  3. Сценарий может столкнуться с проблемами, если для тайм-аута установлено значение меньше ~ 10 секунд (я не проверял, где именно начинается проблема, должно быть меньше 5, я думаю). Это можно сделать, удалив некоторые time.sleep (1) за счет системных ресурсов. Не думайте, что кому-то это понадобится.
  4. Поскольку у нас есть ручка для таймеров, никаких манипуляций с мышью не требуется!
0
ответ дан 10 November 2017 в 23:58

Systemd поддерживает это с помощью команды systemd-inhibit. Пример с этой страницы:

# systemd-inhibit wodim foobar.iso

Это записывает ISO-образ foobar.iso на компакт-диск с помощью wodim(1) и запрещает спящий режим, завершение работы и бездействие системы при этом.

0
ответ дан 29 September 2020 в 17:53

Другие вопросы по тегам:

Похожие вопросы: