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
- Einleitung
- Anpassung der Konfiguration von KDM
- 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/stopDie 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-syntaxin 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;
EOFAuf 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.shDieses 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.shDieses 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
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.