Jalankan program dbus di crontab, bagaimana cara mengetahui tentang SESSION id?

17

Saya perlu menjalankan beberapa program di dalam crontab, tetapi bagaimana program bisa tahu tentang id sesi dbus? itu hanya tersedia untuk program yang diluncurkan oleh manajer sesi.

bunga aster
sumber

Jawaban:

21

Masalahnya adalah agak mirip dengan mengakses tampilan X dan menemukan lokasi file X kue . (Juga, lihat pertanyaan-pertanyaan ini jika Anda ingin meluncurkan program GUI pada tampilan pengguna.)

Dbus menyimpan alamat sesi dalam file di ~/.dbus/session-bus. Nama file tersebut adalah $machine_id-$display_number, di mana $machine_idnomor yang dihasilkan secara acak disimpan /var/lib/dbus/machine-iddan $display_numbermerupakan nomor tampilan X ( $DISPLAYadalah :$display_numberatau :$display_number.$screen_number). File dalam ~/.dbus/session-busdapat diuraikan oleh shell dan berisi definisi untuk DBUS_SESSION_BUS_ADDRESSdan 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

Hati-hati karena tidak ada jaminan bahwa daemon dbus masih tersedia. Pengguna mungkin telah keluar.

Metode alternatif adalah menemukan PID suatu proses di sesi desktop, dan mendapatkan alamat dbus dari lingkungannya.

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

Jika crontab berjalan sebagai root dan Anda ingin berkomunikasi dengan sesi apa pun pengguna yang login di konsol, lihat Dapatkah saya meluncurkan program grafis pada desktop pengguna lain sebagai root?

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Saya pikir jika Anda tahu pid dari manajer sesi gnome, maka Anda membaca lingkungan dari /procfilesystem.

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

Gunakan id SESSION kemudian, dengan program lain seperti notify-send atau dbus * tools.

Bersulang.

Nikhil Mulley
sumber
sangat mengesankan, sebenarnya saya sedang menjalankan KDE4, jadi saya mencari plasma-desktop, terima kasih!
daisy
1
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
Vincenzo
sumber
1

Saya tidak bisa mengomentari jawaban Vincenzo , tetapi saya menemukan jawabannya paling baik untuk saya di KDE4.

Saya harus sedikit memodifikasi perintah. Bagi saya itu:

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

Perhatikan ADDRESSdalam huruf kapital.

noric
sumber
0

Ya DBus harus memiliki sesi kapak. Seperti jawaban sebelumnya, 'DBUS_SESSION_BUS_ADDRESS' harus memiliki nilai sebelum memulai. Namun, Anda dapat menggunakan 'peluncuran dbus' untuk membuat nilai ini. Cuplikan berikut dapat dimasukkan ke dalam skrip yang dipanggil dari 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> 

Satu kemunduran dengan solusi ini adalah bahwa sesi tersebut mungkin hang setelah Anda menghentikan perangkat lunak Anda.

karnbo
sumber