Chạy một chương trình dbus trong crontab, làm thế nào để biết về id SESSION?


17

Tôi cần chạy một số chương trình trong crontab, nhưng làm thế nào chương trình có thể biết về id phiên dbus? nó chỉ có sẵn cho các chương trình được khởi chạy bởi các nhà quản lý phiên.

Câu trả lời:


21

Vấn đề là hơi tương tự như truy cập vào màn hình Xtì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_idmột số được tạo ngẫu nhiên được lưu trữ trong /var/lib/dbus/machine-id$display_numberlà số hiển thị X ( $DISPLAY:$display_numberhoặc :$display_number.$screen_number). Tệp trong ~/.dbus/session-buscó thể phân tích cú pháp bởi trình bao và chứa định nghĩa cho DBUS_SESSION_BUS_ADDRESSDBUS_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?


2

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ừ /prochệ 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.


rất ấn tượng, thực sự tôi đang chạy KDE4, vì vậy tôi đã tìm kiếm plasma-desktopthay thế, cảm ơn!
hoa cúc

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

1

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 ADDRESSbằng chữ in hoa.


0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.