Ich muss ein Programm in crontab ausführen, aber wie kann das Programm die dbus-Sitzungs-ID ermitteln? Es ist nur für Programme verfügbar, die von Sitzungsmanagern gestartet wurden.
Das Problem ähnelt dem Zugriff auf die X-Anzeige und dem Ermitteln des Speicherorts der X-Cookie-Datei . (Lesen Sie diese Fragen auch, wenn Sie ein GUI-Programm auf dem Bildschirm des Benutzers starten möchten.)
Dbus speichert die Sitzungsadresse in einer Datei in ~/.dbus/session-bus
. Der Name der Datei ist $machine_id-$display_number
, in dem $machine_id
eine zufällig erzeugte Zahl , gespeichert in /var/lib/dbus/machine-id
und $display_number
ist die X Anzeigenummer ( $DISPLAY
ist :$display_number
oder :$display_number.$screen_number
). Die Datei in ~/.dbus/session-bus
kann von einer Shell analysiert werden und enthält Definitionen für DBUS_SESSION_BUS_ADDRESS
und DBUS_SESSION_BUS_PID
.
dbus_session_file=~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0
if [ -e "$dbus_session_file" ]; then
. "$dbus_session_file"
export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
dbus-send …
fi
Beachten Sie, dass es keine Garantie dafür gibt, dass der dbus-Daemon noch verfügbar ist. Möglicherweise hat sich der Benutzer abgemeldet.
Eine alternative Methode besteht darin, die PID eines Prozesses in der Desktopsitzung zu ermitteln und die dbus-Adresse aus seiner Umgebung abzurufen.
export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')
Wenn die crontab als root ausgeführt wird und Sie mit der Sitzung eines beliebigen Benutzers kommunizieren möchten, der an der Konsole angemeldet ist, lesen Sie Kann ich als root ein grafisches Programm auf dem Desktop eines anderen Benutzers starten?
Ich denke, wenn Sie die PID des Gnome Session Managers kennen, dann lesen Sie die Umgebung aus dem /proc
Dateisystem.
GNOME_SESSION_PID=<PID_OF_GNOME_SESSION>
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"
Verwenden Sie dann die SESSION-ID mit anderen Programmen wie notify-send oder dbus *.
Prost.
plasma-desktop
stattdessen gesucht , danke!quelle
Ich kann Vincenzos Antwort nicht kommentieren , aber ich finde, dass seine Antwort unter KDE4 am besten für mich funktioniert.
Ich musste den Befehl jedoch leicht ändern. Für mich ist es:
Hinweis
ADDRESS
in Großbuchstaben.quelle
Ja, DBus muss eine Axt-Sitzung haben. Wie bei früheren Antworten muss 'DBUS_SESSION_BUS_ADDRESS' vor dem Start einen Wert haben. Sie können jedoch 'dbus-launch' verwenden, um diesen Wert zu erstellen. Das folgende Snippet könnte in ein Skript eingefügt werden, das von crontab aufgerufen wird.
Ein Nachteil bei dieser Lösung ist, dass die Sitzung nach dem Stoppen der Software möglicherweise unterbrochen wird.
quelle