উত্তর:
সমস্যাটি এক্স ডিসপ্লে অ্যাক্সেস করা এবং এক্স কুকি ফাইলের অবস্থান সন্ধান করার মতো কিছুটা । (এছাড়াও, আপনি যদি ব্যবহারকারীর প্রদর্শনে কোনও জিইআইআই প্রোগ্রাম চালু করতে চান তবে এই প্রশ্নগুলি দেখুন))
ডিবিস একটি ফাইলটিতে সেশন ঠিকানা সঞ্চয় করে ~/.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শেল দ্বারা 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
সাবধান থাকুন যে ডিবাস ডেমন এখনও উপলব্ধ যে কোনও গ্যারান্টি নেই। ব্যবহারকারীর লগ আউট হতে পারে।
একটি বিকল্প পদ্ধতি হ'ল ডেস্কটপ সেশনে কোনও প্রক্রিয়ার পিআইডি সন্ধান করা এবং তার পরিবেশ থেকে ডিবিএস ঠিকানা প্রাপ্ত করা।
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-)"
বিজ্ঞপ্তি-প্রেরণ বা dbus * সরঞ্জামগুলির মতো অন্যান্য প্রোগ্রামগুলির সাথে সেশন আইডিটি ব্যবহার করুন।
চিয়ার্স।
আমি মন্তব্য করতে পারেন না ভিনসেন এর উত্তর , কিন্তু আমি তার উত্তর KDE4 আমাকে জন্য ভাল কাজ করে এটি।
যদিও আমাকে কমান্ডটি সামান্য পরিবর্তন করতে হবে। আমার জন্য এটি:
ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
মূলধনীতে নোটিশ ADDRESS।
হ্যাঁ ডিবিসের অবশ্যই কুঠার সেশন থাকতে হবে। পূর্ববর্তী উত্তরগুলির মতো, 'DBUS_SESSION_BUS_ADDRESS' শুরুর আগে অবশ্যই একটি মান থাকতে হবে। তবে আপনি এই মানটি তৈরি করতে 'ডিবিস-লঞ্চ' ব্যবহার করতে পারেন। নিম্নলিখিত স্নিপেট 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পরিবর্তে সন্ধান করেছি, ধন্যবাদ!