जवाबों:
समस्या कुछ हद तक एक्स डिस्प्ले तक पहुंचने और एक्स कुकी फ़ाइल के स्थान का पता लगाने के समान है । (इसके अलावा, यदि आप उपयोगकर्ता के प्रदर्शन पर GUI प्रोग्राम लॉन्च करना चाहते हैं तो इन प्रश्नों को देखें।)
Dbus सत्र पते को एक फ़ाइल में संग्रहीत करता है ~/.dbus/session-bus
। फ़ाइल का नाम है $machine_id-$display_number
, जहाँ $machine_id
एक बेतरतीब ढंग से उत्पन्न संख्या में संग्रहीत है /var/lib/dbus/machine-id
और $display_number
एक्स डिस्प्ले नंबर ( $DISPLAY
है :$display_number
या :$display_number.$screen_number
) है। फ़ाइल ~/.dbus/session-bus
शेल द्वारा पार्स करने योग्य है और इसमें 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
खबरदार कि कोई गारंटी नहीं है कि डब डेमॉन अभी भी उपलब्ध है। उपयोगकर्ता लॉग आउट हो सकता है।
एक वैकल्पिक विधि डेस्कटॉप सत्र में एक प्रक्रिया के पीआईडी को ढूंढना है, और इसके वातावरण से डबस पता प्राप्त करना है।
export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')
अगर क्रेस्टब रूट के रूप में चल रहा है और आप कंसोल में जो भी उपयोगकर्ता लॉग इन है, के सत्र के साथ संवाद करना चाहते हैं, तो क्या मैं रूट के रूप में किसी अन्य उपयोगकर्ता के डेस्कटॉप पर ग्राफिकल प्रोग्राम लॉन्च कर सकता हूं?
मुझे लगता है कि यदि आप गनोम सत्र प्रबंधक के बारे में जानते हैं, तो आप /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-)"
इसके बाद सेशन आईडी का उपयोग करें, अन्य प्रोग्राम जैसे कि नोटिफ़िकेशन-सेंड या डबस * टूल्स के साथ।
चीयर्स।
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
मैं विन्सेन्ज़ो के उत्तर पर टिप्पणी नहीं कर सकता , लेकिन मुझे केडी 4 पर उसका जवाब मेरे लिए सबसे अच्छा काम लगता है।
हालांकि मुझे कमांड को थोड़ा संशोधित करना पड़ा है। मेरे लिए यह है:
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' का उपयोग कर सकते हैं। स्निपेट को क्रॉस्टैब नामक स्क्रिप्ट में रखा जा सकता है।
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
इसके बजाय देखा , धन्यवाद!