Действительно ли возможно добавить триггерную функцию, прежде чем система войдет, приостанавливают?

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

1
задан 12 February 2017 в 21:40

1 ответ

Присоединение к чему-то?

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

решение

Как всегда, который не означает, что у нас закончились опции. Если мы отключаем пустой экран по умолчанию/, приостанавливают - опции и заменяют его нашим собственным фоновым сценарием, мы можем включать команду, которую Вы хотите выполнить перед изменением состояния в процедуре.

, Как это работает

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

сценарий

#!/usr/bin/env python3
import subprocess
import time

# set times for blank screen and suspend (in that order)
times = [300, 1200]
pre_command = "touch banana.txt"

# don't change anything below, *unless* changes for other distros
last_t = times[-1]
commands = ["xset dpms force off", "sudo xfce4-session-logout --suspend"]
restore = "xset dpms force on"

def gettime():
    return int(int(subprocess.check_output(
        "xprintidle"
        ).decode("utf-8").strip())/1000)

def run_command(cmd):
    # made it like this, so user can conveniently set commands
    subprocess.call(["/bin/bash", "-c", cmd])

def change(set_t, t1, t2):
    if all([t1 <= set_t, t2 > set_t]):
        if set_t == last_t:
            run_command(pre_command)
        run_command(commands[times.index(set_t)])
    elif all([t2 < set_t, t1 >= set_t]):
        run_command(restore)
        return True

t1 = gettime()

while True:
    time.sleep(2)
    t2 = gettime()
    for t in times:
        if change(t, t1, t2):
            break
    t1 = t2

, Как настроить

  1. потребности сценария xprintidle:

    sudo apt-get xprintidle
    
  2. Копия сценарий выше в пустой файл, сохраните его как my_suspend.py

  3. Теперь, мы должны удостовериться, что сценарий может принести компьютер в, приостановите: добавьте строку к sudoers файл:

    • Выполнение от терминала:

      sudo visudo
      
    • Добавляют строку:

      ALL All=NOPASSWD: /usr/bin/xfce4-session-logout*
      

    в файл.

  4. В главном разделе сценария, набор время, после которого Вы хотите очистить экран (в секундах), время, которое Вы хотите, чтобы компьютер переключил для приостановки и команда, которую Вы хотите выполнить перед, приостановите:

    # set times for blank screen and suspend (in that order)
    times = [300, 1200]
    pre_command = "touch banana.txt"
    

    В примере выше, экранные пробелы после 5 минут, система приостанавливает после 20 минут. Очевидно, Вы хотите заменить pre_command

    N.B. , возражают против кавычек вокруг команды! Если Ваша команда также включает смешанные кавычки, упомяните.

  5. Тестовый прогон сценарий от терминала с командой:

    python3 /path/to/my_suspend.py
    

    , Если все хорошо работает, добавьте сценарий для Запущения Приложений (Сессия & Запуск> Автоматический запуск Приложения (вкладка)> Добавляет)

Примечание

, которое сценарий был записан для Xubuntu, но только в строке:

commands = ["xset dpms force off", "sudo xfce4-session-logout --suspend"]

команда:

"sudo xfce4-session-logout --suspend"

Xubuntu-конкретный. Сценарий поэтому может легко быть адаптирован к другим дистрибутивам.

0
ответ дан 8 December 2019 в 06:41

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

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