dbus und KDE · 7 min read · Jan 03, 2026

Integration von dbus und KDE: Starten und Stoppen des Sitzungsanteils von dbus mit KDM.

Integration von dbus und KDE: Starten und Stoppen des Sitzungsanteils von dbus mit KDM.

Inhalte

  1. Einleitung
  2. Anpassung der Konfiguration von KDM
  3. Starten des Sitzungsdaemon von dbus und Bereitstellen der Umgebungsvariablen.
    2.1 Über die Startdateien von Bash.
    2.2 Starten des Sitzungsbusanteils von dbus
    2.3 Stoppen des Sitzungsbusanteils von dbus
    2.4 Ein Benutzer ist mehr als einmal angemeldet

0. Einleitung

Seit einiger Zeit nutzen viele Anwendungen D-BUS. Dies ist der Fall bei KDE 3.5, der aktuellen stabilen Version von KDE. Mit dem bevorstehenden KDE 4 wird D-BUS wichtiger und ersetzt DCOP.

In diesem Howto möchte ich einen Weg beschreiben, um den benutzer- und sitzungsabhängigen Teil von dbus zu starten und zu stoppen. Die Hauptziele, die ich mit diesem Ansatz verfolge, sind:

  • Bereitstellung der für d-bus-bewussten Anwendungen wichtigen Umgebungsvariablen;
  • Sicherstellen, dass der dbus-Sitzungsanteil nicht mehr als einmal für einen einzelnen Benutzer gestartet wird;
  • Sicherstellen, dass der dbus-Sitzungsanteil gestoppt wird, wenn eine Sitzung eines Benutzers endet;

Ich gehe davon aus, dass der Benutzer sich mit KDM, dem Anmeldemanager für KDE 3.5, anmeldet. Die Konstruktion könnte auch sehr gut mit anderen Anmeldemanagern (XDM, GDM) verwendet werden.
KDM hat die Fähigkeit, Skripte zu Beginn einer Sitzung (beim Start) und am Ende (zurücksetzen) auszuführen. Eines davon kann den dbus-Sitzungsanteil starten (und stoppen).

1. KDM: die Dateien

KDM verwendet einige Dateien zum Starten und Stoppen:

. Xstartup
wird als Root ausgeführt, nachdem sich ein Benutzer erfolgreich angemeldet hat.

. Xsession
läuft mit den Berechtigungen des autorisierten Benutzers, um die gewünschte Sitzung (KDE) zu starten.

. Xreset
wird als Root ausgeführt, nachdem die Benutzersitzung beendet wurde.

Wo Xstartup der Ort ist, um Dinge zu starten, ist Xreset der Ort, um diese Befehle rückgängig zu machen.

Für weitere Informationen zu diesen Dateien siehe das Handbuch von KDM.

Durch Hinzufügen des folgenden Codes zur Xstartup-Datei:

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

und den Code zur Xreset-Datei:

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

Erstellen Sie die Verzeichnisse, in denen die Skripte abgelegt werden:

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

Die Dateien in diesen Verzeichnissen müssen für jeden normalen Benutzer zugänglich sein: Daher sind die Berechtigungen 755.
Alle Skripte in diesen Verzeichnissen sollten die gleichen Berechtigungen haben: 755.

Jeder Benutzer sollte in der Lage sein, das Skript auszuführen, aber nur Root kann sie ändern.

1. Starten des Sitzungsdaemon von dbus und Bereitstellen der Umgebungsvariablen

Das dbus-Paket ist in zwei Teile unterteilt: einen systemweiten Teil und einen für (jede) Sitzung/benutzer. Der systemweite Teil (ein Daemon) wird beim Booten mit speziellen Berechtigungen eines bestimmten Benutzers gestartet. Der sitzungsweite Teil (ebenfalls ein Daemon) muss gestartet werden, wenn eine Sitzung für einen Benutzer beginnt, und gestoppt werden, wenn die Sitzung endet.

Die Konstruktion mit kdm, die ich hier verwende, ist ideal dafür. Ein Skript im Startverzeichnis, um den Sitzungsdaemon für einen Benutzer zu starten, der mit den Berechtigungen dieses Benutzers läuft, und ein anderes Skript im Reset-Verzeichnis, um diesen Daemon zu stoppen.

Aber es ist nicht so einfach. Einige Variablen (DBUS_SESSION_BUS_ADDRESS und DBUS_SESSION_BUS_PID) müssen in der Umgebung für jede Anwendung, die mit dbus arbeitet, verfügbar sein. Meiner Meinung nach sollten die Einstellungen dieser Variablen in den Bash-Startskripten erfolgen. Dann sind diese Variablen, egal welches Skript oder welche Anwendung Sie ausführen, auf den richtigen Wert gesetzt.

1.1 Über die Startdateien von Bash

Der Sitzungsdaemon von dbus erstellt eine Datei, die die Umgebungsvariablen enthält. Wie oben erwähnt, sollte diese Datei von bash gelesen (sourced) werden, wenn sie für diesen Benutzer startet.

Wenn bash durch “login” als interaktive Anmeldeshell gestartet wird, liest es /etc/profile und ~/.bash_profile. Bash wird auch von “kdm” gestartet, und die Dateien /etc/profile und ~/.bash_profile werden geladen.

Meine Idee ist es, die Ausgabe des Befehls

dbus-launch --auto-syntax

in der Datei

$HOME/.dbus-session

Diese Datei wird “sourced”, wenn bash startet. Dies geschieht nicht automatisch, aber Sie müssen das folgende Skript zu /etc/profile.d hinzufügen:

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

Auf diese Weise werden die Umgebungsvariablen bereitgestellt, wenn Bash startet.

1.2 Starten des Sitzungsbusanteils von dbus

Ich gehe davon aus, dass dbus installiert ist und beim Booten gestartet wird.

Erstellen Sie ein Skript im Verzeichnis /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
    #
    # Überprüfen, ob der dbus-daemon bereits läuft
    # dbus-daemon muss vom Benutzer (uidnr) gestartet werden, der sich anmeldet
    #
    
    if [ -f $homedir/.dbus-session ]; then
        # Überprüfen, ob der dbus-daemon für diesen Benutzer mit der pid läuft
        # in der .dbus-session-Datei
 
        # pid gemäß dem ps-Befehl
        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)
        
        # pid aus der .dbus-session-Datei lesen
        . $homedir/.dbus-session
        # überprüfen, ob sie gleich sind       
        if [ -z "$ps_dbus_session_pid" ]; then
            
            # dbus für diesen Benutzer läuft nicht
            rm $homedir/.dbus-session
            
        elif [ $DBUS_SESSION_BUS_PID -ne $ps_dbus_session_pid ]; then
            
            # es gibt ein Problem: stoppe den dbus-daemon für diesen Benutzer 
            # und entferne die .dbus-session-Datei
            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
        # starte nur eine dbus-sitzung, wenn die .dbus-session-Datei nicht gefunden wird
        # im Benutzerverzeichnis  
  
        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 "Ein Fehler mit 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

Dieses Skript, das von KDM beim Start ausgeführt wird, startet den dbus-Sitzungsdaemon für diesen Benutzer und erstellt die .dbus-session-Datei im Home-Verzeichnis dieses Benutzers, die alle dbus-Variablen enthält.
Es wird dies nur tun, wenn dbus für diesen Benutzer noch nicht läuft.

Jetzt, wenn bash beim Login startet, liest (sourced) es diese Datei.

Wie Sie sehen können, habe ich den Start von dbus in zwei Teile aufgeteilt:

  • dbus-session-start.sh, läuft, wenn eine (kdm)-Sitzung startet
  • .dbus-session, wird geladen, wenn eine (bash)-Sitzung startet, könnte mehrmals geladen werden

Darüber hinaus verwende ich den Parameter –auto-syntax, wobei ich davon ausgehe, dass Bash verwendet wird. Ich könnte hier –sh-syntax verwenden, aber es funktioniert.

Und Sudo ist erforderlich, um dbus-launcher als den Benutzer auszuführen, der sich anmeldet, da KDM dieses Skript als Root ausführt. (Tatsächlich überprüft das Skript die ID des Kontos, das dieses Skript ausführt. Wenn es Root ist (id = 0), wird sudo verwendet, um zu dem Benutzer zu wechseln, der eine Sitzung startet. Wenn die ID und die ID des sich anmeldenden Benutzers gleich sind, muss nichts getan werden.

2.3 Stoppen des Sitzungsbusanteils von dbus

Erstellen Sie das Skript dbus-session-stop.sh im Reset-Verzeichnis:

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 "Ein Fehler mit 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

Dieses Skript stoppt den Sitzungsanteil des dbus-daemons.

2.4 Ein Benutzer ist mehr als einmal angemeldet

Für die meisten Situationen ist diese Konstruktion gut genug. Die meisten Benutzer haben nur eine Sitzung gleichzeitig. Was passiert nun, wenn ein Benutzer mehr als eine Sitzung gleichzeitig hat? Ist es notwendig, den Sitzungsanteil von dbus für jede Sitzung zu starten, oder ist eine Instanz ausreichend?

Diese Konstruktion erlaubt nicht mehr als einen dbus-daemon pro Benutzer. Ich denke, das sollte gut genug sein.

Änderungsprotokoll:

[2006-01-18]

  • Erstes Howto
    [2006-07-18]
  • Bash-Skripte geändert
    [2006-09-09]
  • Überprüfung hinzugefügt, um zu sehen, ob der dbus-daemon bereits für diesen Benutzer läuft und ob die Informationen in .dbus-session korrekt sind
Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.