ฉันจำเป็นต้องเรียกใช้โปรแกรมบางอย่างภายใน crontab แต่โปรแกรมจะรู้เกี่ยวกับรหัสเซสชัน dbus ได้อย่างไร ใช้ได้เฉพาะกับโปรแกรมที่เปิดตัวโดยผู้จัดการเซสชันเท่านั้น
ฉันจำเป็นต้องเรียกใช้โปรแกรมบางอย่างภายใน crontab แต่โปรแกรมจะรู้เกี่ยวกับรหัสเซสชัน dbus ได้อย่างไร ใช้ได้เฉพาะกับโปรแกรมที่เปิดตัวโดยผู้จัดการเซสชันเท่านั้น
คำตอบ:
ปัญหาคือค่อนข้างคล้ายกับการเข้าถึงการแสดงผลเอ็กซ์และการหาสถานที่ตั้งของไฟล์คุกกี้ X ที่ (โปรดดูคำถามเหล่านี้หากคุณต้องการเปิดโปรแกรม GUI บนหน้าจอของผู้ใช้)
Dbus ~/.dbus/session-bus
เก็บอยู่เซสชั่นในแฟ้มใน ชื่อของไฟล์คือ$machine_id-$display_number
ที่ซึ่ง$machine_id
เป็นหมายเลขที่สร้างแบบสุ่มเก็บไว้ใน/var/lib/dbus/machine-id
และ$display_number
เป็นหมายเลขที่แสดง X ( $DISPLAY
เป็น:$display_number
หรือ:$display_number.$screen_number
) แฟ้มใน~/.dbus/session-bus
เป็น parseable โดยเปลือกและมีคำจำกัดความและDBUS_SESSION_BUS_ADDRESS
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
ระวังว่าไม่มีการรับประกันว่า dbus daemon ยังคงมีอยู่ ผู้ใช้อาจออกจากระบบ
อีกวิธีหนึ่งคือการค้นหา PID ของกระบวนการในเดสก์ท็อปเซสชันและรับที่อยู่ dbus จากสภาพแวดล้อม
export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')
หาก crontab กำลังทำงานเป็นรูทและคุณต้องการสื่อสารกับเซสชันของสิ่งที่ผู้ใช้ล็อกอินในคอนโซลให้ดูที่ฉันสามารถเปิดโปรแกรมกราฟิกบนเดสก์ท็อปของผู้ใช้รายอื่นได้หรือไม่
ฉันคิดว่าถ้าคุณรู้จัก pid ของ gnome session manager คุณก็อ่านสภาพแวดล้อมจาก/proc
ระบบไฟล์
GNOME_SESSION_PID=<PID_OF_GNOME_SESSION>
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"
ใช้รหัส SESSION จากนั้นกับโปรแกรมอื่นเช่นเครื่องมือแจ้งเตือนการส่งหรือ dbus *
ไชโย
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
ฉันไม่สามารถออกความเห็นเกี่ยวกับคำตอบของ Vincenzoแต่ฉันคิดว่าคำตอบของเขาทำงานได้ดีที่สุดสำหรับฉันใน KDE4
ฉันต้องแก้ไขคำสั่งเล็กน้อย สำหรับฉันมัน
ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
แจ้งให้ทราบADDRESS
ในตัวอักษรพิมพ์ใหญ่
ใช่ DBus จะต้องมีช่วงขวาน เช่นเดียวกับคำตอบก่อนหน้า 'DBUS_SESSION_BUS_ADDRESS' ต้องมีค่าก่อนเริ่ม อย่างไรก็ตามคุณสามารถใช้ 'dbus-launch' เพื่อสร้างค่านี้ ตัวอย่างต่อไปนี้สามารถใส่ในสคริปต์ที่เรียกจาก 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>
หนึ่งความล้มเหลวด้วยวิธีนี้คือเซสชั่นอาจหยุดหลังจากที่คุณหยุดซอฟต์แวร์
plasma-desktop
แทนขอบคุณ!