Uruchom program dbus w crontab, jak poznać identyfikator SESSION?


17

Muszę uruchomić jakiś program w crontab, ale skąd program może wiedzieć o identyfikatorze sesji dbus? jest dostępna tylko dla programów uruchamianych przez menedżerów sesji.

Odpowiedzi:


21

Problemem jest nieco podobny do dostępu wyświetlacz X i znalezienia lokalizacji pliku X cookies . (Przeczytaj również te pytania, jeśli chcesz uruchomić program GUI na ekranie użytkownika.)

Dbus przechowuje adres sesji w pliku w ~/.dbus/session-bus. Nazwa pliku to $machine_id-$display_number, gdzie $machine_idjest zapisany losowo wygenerowany numer /var/lib/dbus/machine-idi $display_numberjest to X wyświetlany numer ( $DISPLAYjest :$display_numberlub :$display_number.$screen_number). Plik w ~/.dbus/session-busjest analizowalny przez powłokę i zawiera definicje dla DBUS_SESSION_BUS_ADDRESSi 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

Uwaga: nie ma gwarancji, że demon dbus będzie nadal dostępny. Użytkownik mógł się wylogować.

Alternatywną metodą jest znalezienie PID procesu w sesji pulpitu i uzyskanie adresu dbus z jego środowiska.

export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')

Jeśli crontab działa jako root i chcesz komunikować się z sesją dowolnego użytkownika zalogowanego na konsoli, zobacz Czy mogę uruchomić program graficzny na pulpicie innego użytkownika jako root?


2

Myślę, że jeśli znasz pid menedżera sesji gnome, to czytasz środowisko z /procsystemu plików.

GNOME_SESSION_PID=<PID_OF_GNOME_SESSION> 
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"

Następnie użyj identyfikatora SESSION w przypadku innych programów, takich jak narzędzia powiadomień-wysyłania lub dbus *.

Twoje zdrowie.


bardzo imponujące, właściwie korzystam z KDE4, więc plasma-desktopzamiast tego szukałem , dzięki!
stokrotka

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

1

Nie mogę skomentować odpowiedzi Vincenzo , ale uważam, że jego odpowiedź działa najlepiej dla mnie na KDE4.

Musiałem jednak nieco zmodyfikować polecenie. Dla mnie to:

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

Uwaga ADDRESSwielkimi literami.


0

Tak, DBus musi mieć sesję ax. Podobnie jak wcześniejsze odpowiedzi, „DBUS_SESSION_BUS_ADDRESS” musi mieć wartość przed uruchomieniem. Można jednak użyć funkcji „dbus-launch”, aby utworzyć tę wartość. Poniższy fragment kodu można umieścić w skrypcie wywoływanym z crontab.

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> 

Jedną z wad tego rozwiązania jest to, że sesja może się zawiesić po zatrzymaniu oprogramowania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.