KDE y dbus · 8 min read · Jan 03, 2026

Integración de dbus y KDE: iniciando y deteniendo la parte de sesión de dbus con KDM.

Integración de dbus y KDE: iniciando y deteniendo la parte de sesión de dbus con KDM.

Contenidos

  1. Introducción
  2. Ajustando la configuración de KDM
  3. Iniciando el daemon de sesión de dbus y haciendo disponibles las variables de entorno.
    2.1 Acerca de los archivos de inicio de Bash.
    2.2 Iniciando la parte de sessionbus de dbus
    2.3 Deteniendo la parte de sessionbus de dbus
    2.4 Un usuario está más de una vez conectado

0. Introducción

Desde hace algún tiempo, muchas aplicaciones hacen uso de D-BUS. Este es el caso de KDE 3.5, la versión estable actual de KDE. Con el próximo KDE 4, D-BUS se vuelve más importante, reemplazando a DCOP.

En este cómo hacer quiero describir una forma de iniciar y detener la parte dependiente de usuario y sesión de dbus. Los principales objetivos que tengo en mente con este enfoque son:

  • hacer que las variables de entorno importantes para las aplicaciones conscientes de d-bus estén disponibles;
  • asegurar que la parte de sesión de dbus no se inicie más de una vez para un solo usuario;
  • asegurar que la parte de sesión de dbus se detenga cuando una sesión de un usuario finaliza;

Asumo que el usuario inicia sesión con KDM, el gestor de inicio de sesión para KDE 3.5. La construcción podría usarse muy bien con otros gestores de inicio de sesión (XDM, GDM) también.
KDM tiene la capacidad de ejecutar scripts al comienzo de una sesión (al inicio) y al final (reinicio). Uno de ellos puede iniciar (y detener) la parte de sesión de dbus.

1. KDM: los archivos

KDM utiliza algunos archivos para iniciar y detener:

. Xstartup
se ejecuta como root, después de que un usuario inicia sesión con éxito.

. Xsession
runs con permisos del usuario autorizado, para iniciar la sesión deseada (KDE).

. Xreset
se ejecuta como root, después de que la sesión del usuario ha terminado.

Donde Xstartup es el lugar para iniciar cosas, Xreset es el lugar para deshacer estos comandos.

Para más información sobre estos archivos, consulta el manual de KDM.

Al agregar el siguiente código al archivo Xstartup:

-- snip --
for script in /etc/session.d/kdm/startup/*.sh; do
    if [ -x $script ]; then
        eval $script $USER kdm
    fi;
done;

y el código al archivo Xreset:

-- snip --
for script in /etc/session.d/kdm/reset/*.sh; do
    if [ -x $script ]; then
        eval $script $USER kdm
    fi;
done;

Crea los directorios donde van los scripts:

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/stop

Los archivos en estos directorios deben ser accesibles para cada usuario ordinario: por lo tanto, los permisos son 755.
Todos los scripts en estos directorios deben tener los mismos permisos: 755.

Cada usuario debe poder ejecutar el script, pero solo root puede modificarlos.

1. Iniciando el daemon de sesión de dbus y haciendo disponibles las variables de entorno

El paquete de dbus se divide en dos partes: una parte a nivel de sistema y una para (cada) sesión/usuario. La parte a nivel de sistema (un daemon) se inicia en el tiempo de arranque, con privilegios especiales de un usuario dedicado. La parte a nivel de sesión (también un daemon) debe iniciarse cuando comienza una sesión para un usuario y detenerse cuando la sesión termina.

La construcción con kdm que estoy utilizando aquí es ideal para esto. Un script en el directorio de inicio para iniciar el daemon de sesión para un usuario, ejecutándose con los privilegios de ese usuario, y uno en el directorio de reinicio, otro script que debe detener ese daemon.

Pero no es tan simple como eso. Algunas variables (DBUS_SESSION_BUS_ADDRESS y DBUS_SESSION_BUS_PID) deben estar disponibles en el entorno para cada aplicación que trabaje con dbus. En mi opinión, la configuración de estas variables debería ir en los scripts de inicio de bash. Entonces, cualquier script o aplicación que estés ejecutando, estas variables se establecen en el valor correcto.

1.1 Acerca de los archivos de inicio de Bash

El daemon de sesión de dbus crea un archivo que contiene las variables de entorno. Como se mencionó anteriormente, este archivo debe ser leído (sourced) por bash cuando se inicia para este usuario.

Cuando bash se inicia por “login” como un shell de inicio de sesión interactivo, lee /etc/profile y ~/.bash_profile. Bash también se inicia por “kdm”, y los archivos /etc/profile y ~/.bash_profile son sourced.

Mi idea es almacenar la salida del comando

dbus-launch --auto-syntax

en el archivo

$HOME/.dbus-session

Este archivo es “sourced” cuando bash inicia. Esto no sucede automáticamente, pero tendrás que agregar el siguiente script a /etc/profile.d :

cat >> /etc/profile.d/dbus-session.sh << "EOF"
if [ -f $HOME/.dbus-session ]; then
        . $HOME/.dbus-session
fi;
EOF

De esta manera, las variables de entorno están disponibles cuando Bash inicia.

1.2 Iniciando la parte de sessionbus de dbus

Asumo que dbus está instalado y que se inicia en el tiempo de arranque.

Crea un script en el directorio /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
    #
    # hacer una verificación de si dbus-daemon ya está en ejecución
    # dbus-daemon necesita ser iniciado por el usuario (uidnr) que inicia sesión
    #
    
    if [ -f $homedir/.dbus-session ]; then
        # hacer una verificación de que el dbus-daemon para este usuario está en ejecución con el pid
        # en el archivo .dbus-session
 
        # pid según el 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)
        
        # leer el pid del archivo .dbus-session
        . $homedir/.dbus-session
        # verificar que son iguales       
        if [ -z "$ps_dbus_session_pid" ]; then
        
            # dbus para este usuario no está en ejecución
            rm $homedir/.dbus-session
            
        elif [ $DBUS_SESSION_BUS_PID -ne $ps_dbus_session_pid ]; then
        
            # hay algo mal: detener el dbus-daemon para este usuario 
            # y eliminar el archivo .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
        # solo iniciar una sesión de dbus si el archivo .dbus-session no se encuentra
        # en el directorio personal del usuario  
  
        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 "Un error con 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.sh

Este script, ejecutado por KDM al inicio, iniciará el daemon de sesión de dbus para este usuario y creará el archivo .dbus-session en el directorio personal de este usuario, conteniendo todas las variables de dbus.
Solo lo hará cuando dbus no esté ya en ejecución para este usuario.

Ahora, cuando bash inicia en el inicio de sesión, lee (sources) este archivo.

Como puedes ver, he dividido el inicio de dbus en dos partes:

  • dbus-session-start.sh, se ejecuta cuando comienza una sesión (kdm)
  • .dbus-session, sourced cuando comienza una sesión (bash), podría ser sourced múltiples veces

Además, utilizo el parámetro –auto-syntax, donde asumo que se utiliza Bash. Así que podría usar aquí –sh-syntax, pero funciona.

Y Sudo es necesario para ejecutar dbus-launcher como el usuario que está iniciando sesión, porque KDM ejecuta este script como root. (en realidad, el script verifica la id de la cuenta que ejecuta este script. Si es root (id = 0) entonces se usa sudo para cambiar al usuario que inicia una sesión. Cuando la id y la id del usuario que inicia sesión son las mismas, no se necesita hacer nada.

2.3 Deteniendo la parte de sessionbus de dbus

Creando el script dbus-session-stop.sh en el directorio de reinicio:

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 "Un error con 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.sh

Este script detiene la parte de sesión del dbus-daemon.

2.4 Un usuario está más de una vez conectado

Para la mayoría de las situaciones, esta construcción es lo suficientemente buena. La mayoría de los usuarios tienen una sesión a la vez. Ahora, ¿qué sucede cuando un usuario tiene más de una sesión al mismo tiempo? ¿Es necesario iniciar la parte de sesión de dbus para cada sesión, o es suficiente una instancia?

Esta construcción no permite más de un dbus-daemon por usuario. Creo que eso debería ser suficiente.

CHANGELOG:

[2006-01-18]

  • Cómo hacer inicial
    [2006-07-18]
  • Cambió los scripts de bash
    [2006-09-09]
  • agregar verificación para ver si el dbus-daemon ya está en ejecución para este usuario y la información encontrada en .dbus-session es correcta
Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.