Führen Sie in crontab ein dbus-Programm aus, um die SESSION-ID zu ermitteln.


17

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.

Antworten:


21

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_ideine zufällig erzeugte Zahl , gespeichert in /var/lib/dbus/machine-idund $display_numberist die X Anzeigenummer ( $DISPLAYist :$display_numberoder :$display_number.$screen_number). Die Datei in ~/.dbus/session-buskann von einer Shell analysiert werden und enthält Definitionen für DBUS_SESSION_BUS_ADDRESSund 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?


2

Ich denke, wenn Sie die PID des Gnome Session Managers kennen, dann lesen Sie die Umgebung aus dem /procDateisystem.

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.


sehr beeindruckend, eigentlich arbeite ich mit KDE4, also habe ich plasma-desktopstattdessen gesucht , danke!
Daisy

1
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35

1

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:

ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35

Hinweis ADDRESSin Großbuchstaben.


0

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.

if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
  eval `dbus-launch --sh-syntax`
fi
echo "D-Bus daemon address is:"
echo "$DBUS_SESSION_BUS_ADDRESS"

# -E to export DBUS_SESSION_BUS_ADDRESS. Crucial to make DBUS work.
sudo -u <user> -E <program> 

Ein Nachteil bei dieser Lösung ist, dass die Sitzung nach dem Stoppen der Software möglicherweise unterbrochen wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.