Как временно заблокировать приостановление?

Редактирование /proc/sys/fs/inotify/max_user_watches напрямую приводит к ошибкам Fsync в GVIM. Это связано с тем, что вы не можете напрямую изменять эти файлы. Вместо этого лучше использовать эту команду:

sudo sysctl -w fs.inotify.max_user_watches=100000

Это не вызывает проблем с редактированием файлов, и для меня это выглядит как более правильный метод. [!d2 ]

1
задан 11 November 2017 в 00:58

2 ответа

Если

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

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

Подводя итог:

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

Это не помешает скринсейверу.

Единственная проблема в том, что он будет через 30 минут после завершения процесса, когда система приостанавливается. Это также относится к вашему решению «EDIT».

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

5
ответ дан 25 May 2018 в 03:56
  • 1
    Гениальный, спасибо! Я дам этот поход в этот уик-энд. – Zorn 1 December 2012 в 04:33
  • 2
    Подсказка относительно pm-utils помогла. Обратите внимание, что пакет pm-utils должен быть установлен для того, чтобы это работало - сам каталог может существовать, даже если пакет не установлен. – krlmlr 8 March 2015 в 20:43

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

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

#!/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()

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

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

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

Примечания:

Просто добавьте inactivitymanager & в .profile или .xsessionrc в домашний каталог (см., Какой из них работает для вы не добавляете в обоих, иначе два экземпляра этого скрипта будут выполняться одновременно, что-то, что я не обрабатывал. Я думаю, именно в этих деталях основные реализации превзойдут пользовательские). pm-suspend требует sudo. Для pm-suspend без указания пароля. Как запустить определенные команды sudo без пароля ?. В качестве альтернативы вы можете запустить этот скрипт в режиме sudo и сделать этот сценарий sudoable без пароля (не проблема, если вы используете скрипт как root) Возможно, вам придется установить xprintidle. Поскольку у нас есть дескриптор таймеров , мышь не требуется!
1
ответ дан 25 May 2018 в 03:56

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

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