Crontab में एक dbus प्रोग्राम चलाएं, SESSION id के बारे में कैसे जानें?


17

मुझे crontab के भीतर कुछ प्रोग्राम चलाने की आवश्यकता है, लेकिन प्रोग्राम को dbus सेशन आईडी के बारे में कैसे पता चल सकता है? यह केवल सत्र प्रबंधकों द्वारा शुरू किए गए कार्यक्रमों के लिए उपलब्ध है।

जवाबों:


21

समस्या कुछ हद तक एक्स डिस्प्ले तक पहुंचने और एक्स कुकी फ़ाइल के स्थान का पता लगाने के समान है । (इसके अलावा, यदि आप उपयोगकर्ता के प्रदर्शन पर 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=')

अगर क्रेस्टब रूट के रूप में चल रहा है और आप कंसोल में जो भी उपयोगकर्ता लॉग इन है, के सत्र के साथ संवाद करना चाहते हैं, तो क्या मैं रूट के रूप में किसी अन्य उपयोगकर्ता के डेस्कटॉप पर ग्राफिकल प्रोग्राम लॉन्च कर सकता हूं?


2

मुझे लगता है कि यदि आप गनोम सत्र प्रबंधक के बारे में जानते हैं, तो आप /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-)"

इसके बाद सेशन आईडी का उपयोग करें, अन्य प्रोग्राम जैसे कि नोटिफ़िकेशन-सेंड या डबस * टूल्स के साथ।

चीयर्स।


बहुत प्रभावशाली, वास्तव में मैं केडीई 4 चला रहा हूं, इसलिए मैंने plasma-desktopइसके बजाय देखा , धन्यवाद!
डेज़ी


1

मैं विन्सेन्ज़ो के उत्तर पर टिप्पणी नहीं कर सकता , लेकिन मुझे केडी 4 पर उसका जवाब मेरे लिए सबसे अच्छा काम लगता है।

हालांकि मुझे कमांड को थोड़ा संशोधित करना पड़ा है। मेरे लिए यह है:

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' का उपयोग कर सकते हैं। स्निपेट को क्रॉस्टैब नामक स्क्रिप्ट में रखा जा सकता है।

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> 

इस समाधान के साथ एक झटका यह है कि आपके सॉफ़्टवेयर को बंद करने के बाद सत्र लटका रह सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.