เรียกใช้โปรแกรม dbus ใน crontab จะทราบได้อย่างไรเกี่ยวกับ SESSION id


17

ฉันจำเป็นต้องเรียกใช้โปรแกรมบางอย่างภายใน crontab แต่โปรแกรมจะรู้เกี่ยวกับรหัสเซสชัน dbus ได้อย่างไร ใช้ได้เฉพาะกับโปรแกรมที่เปิดตัวโดยผู้จัดการเซสชันเท่านั้น

คำตอบ:


21

ปัญหาคือค่อนข้างคล้ายกับการเข้าถึงการแสดงผลเอ็กซ์และการหาสถานที่ตั้งของไฟล์คุกกี้ 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_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

ระวังว่าไม่มีการรับประกันว่า dbus daemon ยังคงมีอยู่ ผู้ใช้อาจออกจากระบบ

อีกวิธีหนึ่งคือการค้นหา PID ของกระบวนการในเดสก์ท็อปเซสชันและรับที่อยู่ dbus จากสภาพแวดล้อม

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

หาก crontab กำลังทำงานเป็นรูทและคุณต้องการสื่อสารกับเซสชันของสิ่งที่ผู้ใช้ล็อกอินในคอนโซลให้ดูที่ฉันสามารถเปิดโปรแกรมกราฟิกบนเดสก์ท็อปของผู้ใช้รายอื่นได้หรือไม่


2

ฉันคิดว่าถ้าคุณรู้จัก 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 *

ไชโย


น่าประทับใจมากจริง ๆ แล้วฉันใช้ KDE4 ดังนั้นฉันจึงมองหาplasma-desktopแทนขอบคุณ!
เดซี่


1

ฉันไม่สามารถออกความเห็นเกี่ยวกับคำตอบของ Vincenzoแต่ฉันคิดว่าคำตอบของเขาทำงานได้ดีที่สุดสำหรับฉันใน KDE4

ฉันต้องแก้ไขคำสั่งเล็กน้อย สำหรับฉันมัน

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

แจ้งให้ทราบADDRESSในตัวอักษรพิมพ์ใหญ่


0

ใช่ 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> 

หนึ่งความล้มเหลวด้วยวิธีนี้คือเซสชั่นอาจหยุดหลังจากที่คุณหยุดซอฟต์แวร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.