Estou implementando a notificação de plug and unplug do USB (veja a pergunta relacionada ), e preciso executar algo como notify-send "device plugged" "My Device Title"
. O problema é que, para fazer esse comando funcionar, eu deveria primeiro definir DISPLAY
, assim:
export DISPLAY=":0.0"
E, em segundo lugar, esse comando deve ser chamado pelo usuário apropriado. Diga, para o usuário dimon
:
su dimon -c "notify-send 'device plugged' 'My Device Title'"
Portanto, preciso obter a lista de todas as sessões X ativas e os usuários apropriados e chamar notify-send
para cada usuário em seu DISPLAY
.
Eu tentei usar w
para isso, exemplo de saída no Linux Mint 13 MATE:
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
dimon tty8 :0 Sun15 3days 1:38m 1.95s x-session-manager
dimon pts/0 :0 Sun15 0.00s 0.20s 0.00s tmux
Portanto, temos o nome de usuário e a exibição. Eu decidi analisá-lo assim:
declare -a logged_users=('w |grep -vP "^(USER| )" |awk '{if (NF==8){print $1" "$3} else {print $1" :0"}}' |sort |uniq')
Agora, tenho a matriz logged_users
: [0]
contém dimon
e [1]
contém :0
. Isso seria ótimo, mas infelizmente não funciona em todos os lugares. Digamos que no Ubuntu 12.04 com lightdm nós tenhamos este w
output:
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
nui tty7 18:22 35:56 1.66s 0.11s gnome-session -
nui pts/0 :0.0 18:55 5.00s 0.20s 0.00s w
Não há ideia de por que não há valor FROM para gnome-session
.
E pior ainda, no xubuntu:
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
nui tty7 15:50 31:07 52.55s 0.13s /bin/sh /etc/xd
Nenhuma exibição! Se outro usuário estiver logado, nenhum display é especificado para ele também (mas na verdade é :1.0
)
Então, estou procurando outra abordagem. Eu também sei que temos uma lista de todas as sessões X ativas aqui: /tmp/.X11-unix
, e eu posso pegar a lista delas assim:
cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done
Mas não sei como recuperar usuários.
Então, como obter a lista de todas as sessões X ativas e usuários apropriados?