Como eu chamo o código 'dbus' que monitora quando a tela é bloqueada / desbloqueada?

4

Eu tenho um snippet de código de ( unix.stackexchange.com - Run script no bloqueio / desbloqueio da tela ) que eu planejo modificar porque o "recurso não documentado" do PulseAudio alterna o som da TV para o laptop quando a tela está bloqueada.

O código é bastante simples:

dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
  while true; do
    read X
    if echo $X | grep "desktop-lock" &> /dev/null; then
      SCREEN_LOCKED;
    elif echo $X | grep "desktop-unlock" &> /dev/null; then
      SCREEN_UNLOCKED;
    fi
  done
)

Eu realmente não posso dizer que eu entendo o fluxo / loop de cima para baixo do programa / sub-rotina, mas alguém daqui comentou que funciona e eu confio em seu julgamento.

A questão é quais são as convenções de nomenclatura para o meu script? Qual é o diretório padrão da indústria para colocar o script? Como faço para invocá-lo? ou seja, aplicativos de inicialização, rc.local, cron @reboot, etc. Após a chamada, confio que ele seja executado até a próxima reinicialização.

Ele vai durar para sempre, mesmo que seja usado todas as quartas-feiras na noite da lavanderia, então, idealmente, ele não deve sobrecarregar muitos ciclos de CPU.

    
por WinEunuuchs2Unix 08.12.2016 / 02:01

2 respostas

2

O script

Como mencionado nos comentários, uma versão ligeiramente melhorada é postada aqui (com a ajuda de @Serg e @muru):

dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
  while read X; do
    if [[ "$X" =~ desktop-lock ]]; then
      SCREEN_LOCKED;
    elif [[ "$X" =~ desktop-unlock ]]; then
      SCREEN_UNLOCKED;
    fi
  done
)

Onde armazená-lo?

Você pode armazená-lo em qualquer lugar que desejar no diretório $HOME , se for apenas para seu usuário ou em / usr / local / bin se você quiser que ele esteja disponível para outros usuários.

Quando correr?

O dbus-monitor é executado localmente. Por isso, basta adicionar o script a Startup Applications: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando para executar o script, torne-o mais executável e, em seguida, simplesmente adicione o comando:

/path/to/script

Possivelmente , uma vez que o script envolve a GUI, você precisa esperar até que a interface do usuário seja totalmente carregada. Nesse caso, use:

/bin/bash -c "sleep 10 && /path/to/script"

Nota

Tudo o que o script faz é esperar que o estado mude, ouvindo a comunicação entre processos em seu sistema. Não adiciona nenhum qualquer carga visível ao seu sistema.

    
por Jacob Vlijm 09.12.2016 / 09:03
1

Isso funcionou para mim no Ubuntu 18.04 com Unity

#!/bin/bash
dbus-monitor --session "type='signal',interface='com.canonical.Unity.Session'" | \
(
    # optional: prevent consecutive unlocks/locks
  locked=0
  while true; do
    read X
        echo "$X"
        if echo "$X" | grep "member=Locked" &> /dev/null; then
      if [ $locked -eq 0 ]; then
        echo "Screen locked"
        locked=1
      fi
    elif echo "$X" | grep "member=Unlocked" &> /dev/null; then
      if [ $locked -eq 1 ]; then
        echo "Screen unlocked"
        locked=0
      fi
    fi
  done
)

Ao usar o Gnome, a segunda linha deve ser substituída por

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \

e o conteúdo entre as aspas após grep com "boolean true" e "boolean false" respectivamente.

Adicione este script aos aplicativos de inicialização e ele começará a funcionar assim que você fizer o login pela primeira vez.

    
por 1mi 03.10.2018 / 16:24