É possível adicionar a função de gatilho antes que o sistema entre em suspensão?

1

Estou tentando descobrir se é possível adicionar algum tipo de script, acionado antes que o sistema seja suspenso. A ideia é acionar alguns webhooks para armazenar algumas informações antes do estado ocioso.

    
por Karan S. Sisodia 07.02.2017 / 20:30

1 resposta

0

Conectando-se a algo?

O desafio é que qualquer que seja o hook existente em qualquer tela em branco ou em suspensão, o comando ou script relacionado que você deseja executar antes sempre será executado muito tarde, já que seria chamado após o sinal possível.

A solução

Como sempre, isso não significa que ficamos sem opções. Se desabilitarmos a tela em branco padrão / suspend -options, e substituí-la pelo nosso script de segundo plano, podemos incluir o comando que você deseja executar antes da mudança de estado no procedimento.

Como funciona

No script abaixo, você pode definir o tempo ocioso após o qual a tela deve ficar em branco e quando o sistema deve entrar em suspensão. Você também pode definir o comando para executar antes suspender.

O script

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

Como configurar

  1. O script precisa de xprintidle :

    sudo apt-get xprintidle
    
  2. Copie o script acima em um arquivo vazio, salve-o como my_suspend.py

  3. Agora, precisamos garantir que o script possa colocar o computador em suspensão: adicione uma linha ao arquivo sudoers :

    • Executar a partir de um terminal:

      sudo visudo
      
    • Adicione a linha:

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

    para o arquivo.

  4. Na seção head do script, defina o tempo após o qual você deseja colocar a tela em branco (em segundos), a hora em que deseja que o computador alterne para suspender e o comando que você deseja executar antes de suspender:

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

    No exemplo acima, a tela em branco após 5 minutos, o sistema suspende após 20 minutos. Obviamente, você quer substituir o pre_command

    N.B. veja as citações em torno do comando! Se o seu comando também incluir aspas misturadas, por favor mencione.

  5. Teste- execute o script a partir de um terminal com o comando:

    python3 /path/to/my_suspend.py
    

    Se tudo funcionar bem, adicione o script a Startup Applications (Session e Startup > Application Autostart (guia) > Adicionar)

Nota

O script foi escrito para o Xubuntu, mas apenas na linha:

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

O comando:

"sudo xfce4-session-logout --suspend"

é específico do Xubunt. O roteiro, portanto, pode ser facilmente adaptado a outras distros.

    
por Jacob Vlijm 11.02.2017 / 08:18