Câu trả lời:
Vấn đề là hơi tương tự như truy cập vào màn hình X và tìm ra vị trí của file X Cookie . (Ngoài ra, hãy tham khảo những câu hỏi này nếu bạn muốn khởi chạy chương trình GUI trên màn hình của người dùng.)
Dbus lưu địa chỉ phiên trong một tệp trong ~/.dbus/session-bus
. Tên của tệp là $machine_id-$display_number
, trong đó $machine_id
một số được tạo ngẫu nhiên được lưu trữ trong /var/lib/dbus/machine-id
và $display_number
là số hiển thị X ( $DISPLAY
là :$display_number
hoặc :$display_number.$screen_number
). Tệp trong ~/.dbus/session-bus
có thể phân tích cú pháp bởi trình bao và chứa định nghĩa cho DBUS_SESSION_BUS_ADDRESS
và 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
Coi chừng không có gì đảm bảo rằng dbus daemon vẫn có sẵn. Người dùng có thể đã đăng xuất.
Một phương pháp khác là tìm ra PID của một tiến trình trong phiên máy tính để bàn và lấy địa chỉ dbus từ môi trường của nó.
export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')
Nếu crontab đang chạy với quyền root và bạn muốn liên lạc với phiên của bất kỳ người dùng nào đã đăng nhập trên bảng điều khiển, hãy xem Tôi có thể khởi chạy chương trình đồ họa trên máy tính để bàn của người dùng khác với quyền root không?
Tôi nghĩ rằng nếu bạn biết pid của trình quản lý phiên gnome, thì bạn đọc môi trường từ /proc
hệ thống tập tin.
GNOME_SESSION_PID=<PID_OF_GNOME_SESSION>
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"
Sau đó, sử dụng id SESSION, với các chương trình khác như công cụ notify-send hoặc dbus *.
Chúc mừng.
Tôi không thể nhận xét về câu trả lời của Vincenzo , nhưng tôi thấy câu trả lời của anh ấy phù hợp nhất với tôi trên KDE4.
Tôi đã phải sửa đổi một chút lệnh mặc dù. Đối với tôi đó là:
ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
Thông báo ADDRESS
bằng chữ in hoa.
Có DBus phải có phiên rìu. Giống như các câu trả lời trước đó, 'DBUS_SESSION_BUS_ADDRESS' phải có giá trị trước khi bắt đầu. Tuy nhiên, bạn có thể sử dụng 'dbus-launch' để tạo giá trị này. Đoạn mã sau có thể được đặt trong một tập lệnh được gọi từ 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>
Một nhược điểm với giải pháp này là phiên có thể bị treo sau khi bạn dừng phần mềm của mình.
plasma-desktop
thay thế, cảm ơn!