dbus e KDE · 7 min read · Jan 03, 2026
Integração do dbus e KDE: iniciando e parando a parte da sessão do dbus com KDM.
Integração do dbus e KDE: iniciando e parando a parte da sessão do dbus com KDM.
Conteúdos
- Introdução
- Ajustando a configuração do KDM
- Iniciando o daemon de sessão do dbus e tornando as variáveis de ambiente disponíveis.
2.1 Sobre os arquivos de inicialização do Bash.
2.2 Iniciando a parte do sessionbus do dbus
2.3 Parando a parte do sessionbus do dbus
2.4 Um usuário está logado mais de uma vez
0. Introdução
Desde algum tempo, muitas aplicações fazem uso do D-BUS. Este é o caso do KDE 3.5, a versão estável atual do KDE. Com o próximo KDE 4, o D-BUS está se tornando mais importante, substituindo o DCOP.
Neste guia, quero descrever uma maneira de iniciar e parar a parte do dbus dependente do usuário e da sessão. Os principais objetivos que tenho em mente com essa abordagem são:
- tornar as variáveis de ambiente importantes para aplicações cientes do d-bus disponíveis;
- garantir que a parte da sessão do dbus não seja iniciada mais de uma vez para um único usuário;
- garantir que a parte da sessão do dbus seja parada quando uma sessão de um usuário termina;
Assumo que o usuário faz login com o KDM, o gerenciador de login para o KDE 3.5. A construção poderia muito bem ser usada com outros gerenciadores de login (XDM, GDM) também.
O KDM tem a capacidade de executar scripts no início de uma sessão (na inicialização) e no final (reset). Um deles pode iniciar (e parar) a parte da sessão do dbus.
1. KDM: os arquivos
O KDM usa alguns arquivos para iniciar e parar:
. Xstartup
executado como root, após um usuário fazer login com sucesso.
. Xsession
runs com permissões do usuário autorizado, para iniciar a sessão desejada (KDE).
. Xreset
executado como root, após a sessão do usuário ter terminado.
Onde Xstartup é o lugar para iniciar as coisas, Xreset é o lugar para desfazer esses comandos.
Para mais informações sobre esses arquivos, consulte o manual do KDM.
Ao adicionar o seguinte código ao arquivo Xstartup:
-- snip --
for script in /etc/session.d/kdm/startup/*.sh; do
if [ -x $script ]; then
eval $script $USER kdm
fi;
done;E o código ao arquivo Xreset:
-- snip --
for script in /etc/session.d/kdm/reset/*.sh; do
if [ -x $script ]; then
eval $script $USER kdm
fi;
done;Crie os diretórios onde os scripts vão:
install -m755 -d /etc/session.d/kdm/startup
install -m755 -d /etc/session.d/kdm/reset
install -m755 -d /etc/session.d/scripts/start
install -m755 -d /etc/session.d/scripts/stopOs arquivos nesses diretórios devem ser acessíveis para cada usuário comum: portanto, as permissões são 755.
Todos os scripts nesses diretórios devem ter as mesmas permissões: 755.
Cada usuário deve ser capaz de executar o script, mas apenas o root pode modificá-los.
1. Iniciando o daemon de sessão do dbus e tornando as variáveis de ambiente disponíveis
O pacote dbus é dividido em duas partes: uma parte de sistema e uma para (cada) sessão/usuário. A parte de sistema (um daemon) é iniciada na inicialização, com privilégios especiais de um usuário dedicado. A parte de sessão (também um daemon) deve ser iniciada quando uma sessão para um usuário começa e parada quando a sessão termina.
A construção com o kdm que estou usando aqui é ideal para isso. Um script no diretório de inicialização para iniciar o daemon de sessão para um usuário, executando com os privilégios desse usuário, e um no diretório de reset, outro script deve parar esse daemon.
Mas não é tão simples assim. Algumas variáveis (DBUS_SESSION_BUS_ADDRESS e DBUS_SESSION_BUS_PID) devem estar disponíveis no ambiente para cada aplicação que trabalha com dbus. Na minha opinião, a configuração dessas variáveis deve ir nos scripts de inicialização do bash. Assim, qualquer script ou aplicação que você estiver executando, essas variáveis são definidas para o valor correto.
1.1 Sobre os arquivos de inicialização do Bash
O daemon de sessão do dbus cria um arquivo que contém as variáveis de ambiente. Como afirmado acima, esse arquivo deve ser lido (sourced) pelo bash quando ele inicia para esse usuário.
Quando o bash é iniciado por “login” como um shell de login interativo, ele lê /etc/profile e ~/.bash_profile. O bash também é iniciado pelo “kdm”, e os arquivos /etc/profile e ~/.bash_profile são sourced.
Minha ideia é armazenar a saída do comando
dbus-launch --auto-syntaxno arquivo
$HOME/.dbus-session
Esse arquivo é “sourced” quando o bash inicia. Isso não acontece automaticamente, mas você terá que adicionar o seguinte script a /etc/profile.d :
cat >> /etc/profile.d/dbus-session.sh << "EOF"
if [ -f $HOME/.dbus-session ]; then
. $HOME/.dbus-session
fi;
EOFDessa forma, as variáveis de ambiente são disponibilizadas quando o Bash inicia.
1.2 Iniciando a parte do sessionbus do dbus
Assumo que o dbus está instalado e que é iniciado na inicialização.
Crie um script no diretório /etc/session.d/scripts/start dbus-session-start.sh:
cd /etc/session.d/scripts/start
cat >> dbus-session-start.sh << "EOF"
#!/bin/bash
retcode=0;
userid=$1
userproperties=$(getent passwd | grep -m 1 -E "^$userid")
homedir=$(echo $userproperties | cut -d ":" -f 6);
gidnr=$(echo $userproperties | cut -d ":" -f 4);
uidnr=$(echo $userproperties | cut -d ":" -f 3);
if [ -d $homedir ]; then
#
# faça uma verificação se o dbus-daemon já está em execução
# o dbus-daemon precisa ser iniciado pelo usuário (uidnr) fazendo login
#
if [ -f $homedir/.dbus-session ]; then
# faça uma verificação se o dbus-daemon para este usuário está em execução com o pid
# no arquivo .dbus-session
# pid de acordo com o comando ps
ps_dbus_session_pid=$(ps aux | grep -m 1 -E "^$userid.*dbus-daemon.*session.*"
| grep -v "grep" | sed 's@[[:space:]][[:space:]]*@ @g' | cut -d " " -f 2)
# leia o pid do arquivo .dbus-session
. $homedir/.dbus-session
# verifique se são os mesmos
if [ -z "$ps_dbus_session_pid" ]; then
# dbus para este usuário não está em execução
rm $homedir/.dbus-session
elif [ $DBUS_SESSION_BUS_PID -ne $ps_dbus_session_pid ]; then
# há algo errado: pare o dbus-daemon para este usuário
# e remova o arquivo .dbus-session
if [ $(id -u) -eq 0 ]; then
sudo -H -u $userid sh -c "kill $ps_dbus_session_pid"
elif [ $(id -u) -eq $uidnr ]; then
kill -SIGTERM $ps_dbus_session_pid;
fi
rm $homedir/.dbus-session
fi
fi
if [ ! -f $homedir/.dbus-session ]; then
# apenas inicie uma sessão dbus se o arquivo .dbus-session não for encontrado
# no diretório home do usuário
if [ $(id -u) -eq 0 ]; then
sudo -u $userid -H /bin/sh -c "dbus-launch --auto-syntax > $homedir/.dbus-session"
retcode=$?
chown $uidnr:$gidnr $homedir/.dbus-session
elif [ $(id -u) -eq $uidnr ]; then
dbus-launch --auto-syntax > $homedir/.dbus-session
retcode=$?
fi
fi
fi;
if [ $retcode -ne 0 ]; then
echo "Um erro com o dbus ($retcode)."
fi;
exit $retcode
EOF
chmod --verbose --mode 755 /etc/session.d/scripts/start/dbus-session-start.sh
ln -v -sf ../../scripts/start/dbus-session-start.sh /etc/session.d/kdm/startup/10dbus.shEsse script, executado pelo KDM na inicialização, iniciará o daemon de sessão do dbus para este usuário e criará o arquivo .dbus-session no diretório home deste usuário, contendo todas as variáveis do dbus.
Ele só fará isso quando o dbus não estiver já em execução para este usuário.
Agora, quando o bash inicia no login, ele lê (sources) este arquivo.
Como você pode ver, eu dividi o início do dbus em duas partes:
- dbus-session-start.sh, executa quando uma sessão (kdm) começa
- .dbus-session, sourced quando uma sessão (bash) começa, pode ser sourced várias vezes
Além disso, eu uso o parâmetro –auto-syntax, onde assumo que o Bash é usado. Então eu poderia usar aqui –sh-syntax, mas funciona.
E o Sudo é necessário para executar o dbus-launcher como o usuário que está fazendo login, porque o KDM executa este script como root. (na verdade, o script verifica o id da conta que está executando este script. Se for root (id = 0), então o sudo é usado para mudar para o usuário que está iniciando uma sessão. Quando o id e o id do usuário que está fazendo login são os mesmos, nada precisa ser feito.
2.3 Parando a parte do sessionbus do dbus
Criando o script dbus-session-stop.sh no diretório de reset:
cd /etc/session.d/scripts/stop
cat >> dbus-session-stop.sh << "EOF"
#!/bin/bash
retcode=0;
userid=$1
userproperties=$(getent passwd | grep -m 1 -E "^$userid")
homedir=$(echo $userproperties | cut -d ":" -f 6);
gidnr=$(echo $userproperties | cut -d ":" -f 4);
uidnr=$(echo $userproperties | cut -d ":" -f 3);
if [ -f $homedir/.dbus-session ]; then
. $homedir/.dbus-session
if [ -n "$DBUS_SESSION_BUS_PID" ]; then
if [ $(id -u) -eq 0 ]; then
sudo -u $userid -H /bin/sh -c "kill $DBUS_SESSION_BUS_PID"
retcode=$?
rm $homedir/.dbus-session
elif [ $(id -u) -eq $uidnr ]; then
kill $DBUS_SESSION_BUS_PID
retcode=$?
rm $homedir/.dbus-session
fi
fi
fi;
if [ $retcode -ne 0 ]; then
echo "Um erro com o dbus ($retcode)."
fi;
exit $retcode
EOF
chmod --verbose --mode 755 dbus-session-stop.sh
ln -v -sf ../../scripts/stop/dbus-session-stop.sh /etc/session.d/kdm/reset/90dbus.shEsse script para a parte da sessão do dbus-daemon.
2.4 Um usuário está logado mais de uma vez
Para a maioria das situações, essa construção é boa o suficiente. A maioria dos usuários tem uma sessão por vez. Agora, o que acontece quando um usuário tem mais de uma sessão ao mesmo tempo? É necessário iniciar a parte da sessão do dbus para cada sessão, ou uma instância é suficiente?
Essa construção não permite mais de um dbus-daemon por usuário. Eu acho que isso deve ser bom o suficiente.
CHANGELOG:
[2006-01-18]
- Guia inicial
[2006-07-18] - Mudou os scripts bash
[2006-09-09] - adicionar verificação para ver se o dbus-daemon já está em execução para este usuário e se as informações encontradas em .dbus-session estão corretas
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.