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.

Gänseblümchen
quelle

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?

Gilles 'SO - hör auf böse zu sein'
quelle
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.

Nikhil Mulley
quelle
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
Vincenzo
quelle
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.

noric
quelle
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.

karnbo
quelle