Como executar o script após retomar e após desbloquear a tela

13

No Ubuntu 12.04 LTS, eu gostaria de executar scripts depois de retomar a suspensão e depois de desbloquear minha área de trabalho. Eles precisam ser executados como meu usuário e com acesso ao meu $DISPLAY.

Em particular, eu gostaria de

  • reinicie nm-appletpara solucionar o bug 985028
  • mostrar uma notificação personalizada usando notify-send
  • possivelmente outras coisas quando eu conseguir esses trabalhando

Quando reinicio, os scripts /etc/pm/sleep.d/são executados, mas são executados como raiz, sem o conhecimento da minha tela e nome de usuário. Pode funcionar se eu codificar meu nome de usuário e exporto padrão DISPLAY :0nesses scripts, mas isso parece um truque muito feio.

Os scripts são ~/.config/autostart/xyz.desktopexecutados após o login, mas não são executados após apenas desbloquear a tela após o reinício.

Existe uma maneira de executar scripts após desbloquear a tela após um currículo?

mivk
fonte
Para não codificar o nome de usuário, você pode usar users, supondo que ninguém mais esteja logado. (Ou isso não importa) #
Sparhawk

Respostas:

9

Parece que você precisa codificar o nome de usuário na resposta anterior de qualquer maneira, então aqui está um script simples para /etc/pm/sleep.d se alguém estiver procurando uma solução rápida:

#!/bin/bash 
case "$1" in
    hibernate|suspend)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on suspend"
        ;;
    thaw|resume)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on resume"
        ;;
esac
aaron-bru
fonte
5

Esta pergunta no site Unix e Linux documenta uma abordagem alternativa usando mensagens dbus:

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

Substitua SCREEN_LOCKED e SCREEN_UNLOCKED pelas ações que você deseja executar.

Usar xrandr 1>/dev/null 2>1a ação de desbloqueio corrigiu meu problema de que as resoluções / posições do monitor não estavam sendo restauradas corretamente no desbloqueio da tela (o xrandr parece causar uma releitura das configurações da tela). Adicionei esta linha como uma tarefa em segundo plano no meu .bash_profile (estritamente pode ser melhor como um arquivo da área de trabalho em ~ / .config / autostart, pois isso só é executado quando você inicia o gnome):

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean false" &> /dev/null; then xrandr 1>/dev/null 2>1; fi done ) &

Informações adicionais sobre a API do gnome-screensaver podem ser encontradas neste site e no monitor dbus aqui .

Kim SJ
fonte
1

Uma solução é um script que é executado ao fazer login na área de trabalho e que captura mensagens do dbus. Após a retomada da suspensão, a tela é bloqueada e, após digitar a senha, ocorre um evento Unlock no dbus.

(Obrigado a Kim SJ por me colocar no caminho certo. Não tenho sinais do ScreenSaver, mas encontrei outra interface para usar).

Em ~/.config/autostart/, eu tenho um arquivo .desktop que inicia um script bash:

$ cat ~/.config/autostart/mymonitor.desktop
[Desktop Entry]
Categories=System;Monitor;
Comment=Monitor dbus for unlock signals
Exec=/usr/local/bin/unlock_monitor
Name=unlock_monitor
Type=Application

O unlock_monitorscript do monitor lê mensagens dbus com.canonical.Unity.Sessione faz coisas com Unlockedsinais:

#!/bin/bash

dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session" --profile \
| while read dbusmsg; do
    if [[ "$dbusmsg" =~ Unlocked$ || "$dbusmsg" =~ NameAcquired$ ]] ; then
        sleep 5
        notify-send "$(basename $0)" "Unlocked or freshly logged in..."
        # ...
    fi
done

Ao efetuar login, não há sinal "Desbloqueado", mas há um sinal "NameAcquired" ao dbus-monitoriniciar.

mivk
fonte
0

Você pode executar um script usando start-stop-daemon. O start-stop-daemon pode bifurcar o encadeamento em execução como uid e gid diferente, resolvendo seu problema.

O que você precisa fazer é escrever um script de tarefa colocado no PATH do sistema /usr/bin, e criar um script daemon extra no /etc/pm/sleep.d. pm-suspendAção correspondente como resumeou thawo script daemon confirma o script da tarefa via

start-stop-daemon --start $ARGs --name nm-rtvt--exec /usr/bin/job_script

onde ARGspoderia estar --chuid 1001:1001ou apenas --user your_username.

E para integridade, você também pode querer que o script daemon pare o damon nomeado nm-rtvtantes de suspender via

start-stop-daemon --stop <...>

pm-suspendações correspondentes como suspendou hibernate.

Para detalhes man start-stop-daemon,. E há muitos outros exemplos /etc/init.dde scripts daemon.

funicorn
fonte