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.
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.
Jawaban:
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_id
nomor yang dihasilkan secara acak disimpan /var/lib/dbus/machine-id
dan $display_number
merupakan nomor tampilan X ( $DISPLAY
adalah :$display_number
atau :$display_number.$screen_number
). File dalam ~/.dbus/session-bus
dapat diuraikan oleh shell dan berisi definisi untuk DBUS_SESSION_BUS_ADDRESS
dan 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?
Saya pikir jika Anda tahu pid dari manajer sesi gnome, maka Anda membaca lingkungan dari /proc
filesystem.
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.
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 ADDRESS
dalam huruf kapital.
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.
plasma-desktop
, terima kasih!