Como executar um script na tela de bloqueio / desbloqueia no Ubuntu 17.10

2

Meu problema é o mesmo desta questão, mas não consigo fazê-lo funcionar no ubuntu 17.10:

Como executar um comando ou script no bloqueio de tela / desbloqueio?

Eu quero executar um script que mude a configuração RGB do meu teclado nos bloqueios de tela. O script é executado sem falhas. O problema é obter o evento do bloqueio / desbloqueio. Eu tentei usar o dbus-monitor como dito nessa pergunta e como dito aqui:

link

Então, executando este script:

#!/bin/bash

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \
( while true
    do read X
    if echo $X | grep "boolean true" &> /dev/null; then
        echo "locking at $(date)" >> $HOME/time_xprofile
    elif echo $X | grep "boolean false" &> /dev/null; then
        echo "unlocking at $(date)" >> $HOME/time_xprofile
    fi
    done )

Mas isso só funciona ... algumas vezes (!) .... não consigo entender o que acontece.

Estou usando o ubuntu 17.10 com o gnome do Ubuntu sobre o X-server (não Wayland) e tento experimentar o gnome vanilla e ter o mesmo problema.

Eu também tenho tentado:

dbus-monitor > out.log

Para ver TODOS os traços que ocorrem durante o bloqueio / desbloqueio e não aparece esse sinal ... Apenas .... bem ... muito poucas vezes ...

Eu não sei o que fazer, qualquer conselho será útil.

    
por eddieferetro 08.11.2017 / 09:51

2 respostas

2

Supondo que você esteja usando o Gnome, então Hoje em dia eu acho que é melhor ouvir as mensagens LockedHint do que as do protetor de tela. Dessa forma, você não está preso a uma implementação de protetor de tela.

Aqui está um script simples para fazer isso:

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint

Dá isto:

/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
    
por Matthew 11.06.2018 / 01:37
3

Use a existência do processo gnome-screensaver-dialog como um gatilho alternativo

Se dbus não for possível ou não for preferido por qualquer motivo, você pode usar a existência do processo gnome-screensaver-dialog como um acionador. O processo é chamado na tela de bloqueio.

Em um script python:

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

procname = "gnome-screensaver-dialog"
lock_command = "/path/to/lockscript"
unlock_command = "/path/to/unlockscript"

lock1 = None

while True:
    time.sleep(2)
    lock2 = procname in (p.name() for p in psutil.process_iter())
    if lock2 != lock1:
        if lock2:
            subprocess.Popen(lock_command)
            print("locked")
        else:
            subprocess.Popen(unlock_command)
            print("unlocked")
        lock1 = lock2

Como usar

  1. Copie o script em um arquivo vazio, salve-o como locktoggle.py
  2. Na seção principal:

    lock_command = "/path/to/lockscript"
    unlock_command = "/path/to/unlockscript"
    

    defina os comandos ou caminhos para os scripts que você gostaria de executar (deixe as aspas duplas!)

  3. Teste- execute o script com o comando:

    python3 /path/to/locktoggle.py
    

N.B. Caso você só execute um comando em um dos eventos lock / unlock, simplesmente comente a linha correspondente na seção:

if lock2 != lock1:
    if lock2:
        # subprocess.Popen(lock_command)
        print("locked")
    else:
        # subprocess.Popen(unlock_command)
        print("unlocked")
    
por Jacob Vlijm 08.11.2017 / 12:12