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.
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_id
jest zapisany losowo wygenerowany numer /var/lib/dbus/machine-id
i $display_number
jest to X wyświetlany numer ( $DISPLAY
jest :$display_number
lub :$display_number.$screen_number
). Plik w ~/.dbus/session-bus
jest analizowalny przez powłokę i zawiera definicje dla DBUS_SESSION_BUS_ADDRESS
i 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?
Myślę, że jeśli znasz pid menedżera sesji gnome, to czytasz środowisko z /proc
systemu 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.
plasma-desktop
zamiast tego szukałem , dzięki!źródło
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:
Uwaga
ADDRESS
wielkimi literami.źródło
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.
Jedną z wad tego rozwiązania jest to, że sesja może się zawiesić po zatrzymaniu oprogramowania.
źródło