আমার একটি ডেমন রয়েছে, ব্যাশ এবং প্রয়োগের মাধ্যমে প্রয়োগ করা হয়েছে cron
এবং @reboot
বিকল্পটি রয়েছে যা ডেস্কটপটিকে নিষ্ক্রিয়তায় দেখায়। স্ক্রিপ্টটি নিম্নলিখিত হিসাবে রয়েছে (পরীক্ষার উদ্দেশ্যে সময় সংক্ষিপ্ত):
#!/bin/bash
P_STATE=0
while :
do
sleep 5
if [ $P_STATE == 0 ]; then
[ `xprintidle` -ge 25000 ] && P_STATE=1 && wmctrl -k on
else
[ `xprintidle` -le 25000 ] && P_STATE=0
done
সমস্যা: উদাহরণস্বরূপ, কোনও ব্যবহারকারী যদি লগইন স্ক্রিনে থাকে xprintidle
এবং wmctrl
ডেস্কটপটি এখনও লোড না হওয়ায় ব্যর্থ হয়। এটি এড়াতে, আমি স্ক্রিপ্টের একেবারে শুরুতে পরবর্তী লাইনগুলি রেখেছি:
while:
do
sleep 10s
[ -n `who | grep "$USER"` ] && break
done
সুতরাং, স্ক্রিপ্টটি ব্যবহারকারীর জন্য অপেক্ষা করছে (ব্যবহারকারী ভেরিয়েবলটি ক্রন্টব ফাইলটিতে আমার ব্যবহারকারী নামটিতে সেট করা আছে) লগ হয়েছে। তবে এটি ব্যবহারকারীর দ্বারা শুরু হয়, উদাহরণস্বরূপ, একটি টার্মিনাল সেশন (এবং কে। ডি। জিনোমের মতো গ্রাফিকাল সেশন নয়), স্ক্রিপ্টটিও অবিরত থাকে।
কোনও ব্যবহারকারী ইতিমধ্যে "ডেস্কটপ মোড দেখানোর" সক্ষম "গ্রাফিকাল" সেশনে আছেন কিনা তা আমি কীভাবে নির্ধারণ করতে পারি? এবং তদ্ব্যতীত, কীভাবে আমি নিশ্চিত করতে পারি যে একটি "গ্রাফিকাল" সেশনটি সম্পূর্ণ লোড হয়েছে এবং লোডিংয়ের প্রক্রিয়াতে বা এর মতো কিছু নেই?
আমার সমাধান:
আমার (অনানুষ্ঠানিক) সমাধানটি মূল লুপটিতে যুক্ত করছে grep
:
WAIT_TIME=180
while:
do
sleep $WAIT_TIME
[ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue
## My actions here
done
টার্গেট উইন্ডোজ ম্যানেজার কমান্ড "$ WM_CMD" হচ্ছে । আমি ধরে নিলাম, যদি উইন্ডোজ ম্যানেজার কমান্ডটি সিস্টেমে চলমান থাকে তবে এর অর্থ ডেস্কটপ পুরোপুরি লোড হয়েছে এবং কোনও "গ্রাফিক" কমান্ড নিশ্চিত is
ডাব্লুএম_সিএমডি ভেরিয়েবল কোথায় সংজ্ঞায়িত হয়? ইন crontab
লাইন:
@reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null
তবে আমিও মনে করি যে অন্যান্য সিস্টেমের অনুরোধের মাধ্যমে "উইন্ডোজ ম্যানেজার কমান্ড" সনাক্ত করা সম্ভব হবে। যাইহোক, আমার জন্য ক্রোনটব ফাইলে ডাব্লুএম_সিমিডি সংজ্ঞা দেওয়া যথেষ্ট।
lightdm