मेरे पास एक डेमॉन है, जिसे बैश में लागू किया गया है 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
इसलिए, स्क्रिप्ट उपयोगकर्ता का इंतजार करती है (USER चर मेरे उपयोगकर्ता-नाम को crontab फ़ाइल में सेट किया गया है) लॉग किया गया है। लेकिन, यह एक उपयोगकर्ता शुरू होता है, उदाहरण के लिए, एक टर्मिनल सत्र (और केडीई या गनोम जैसे ग्राफिकल सत्र नहीं), स्क्रिप्ट भी जारी रहती है।
मैं यह कैसे निर्धारित कर सकता हूं कि कोई उपयोगकर्ता पहले से ही "ग्राफिकल" सत्र में है जो "डेस्कटॉप मोड दिखाने" में सक्षम है या नहीं? और इसके अलावा, मैं यह कैसे सुनिश्चित कर सकता हूं कि "ग्राफिकल" सत्र पूरी तरह से लोड हो रहा है और लोडिंग की प्रक्रिया में या ऐसा कुछ नहीं है?
मेरा समाधान:
मेरा (अनौपचारिक) समाधान मुख्य लूप 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" होने के नाते । मुझे लगता है कि, अगर विंडोज़ मैनेजर कमांड सिस्टम में चल रहा है, तो इसका मतलब है कि डेस्कटॉप पूरी तरह से भरा हुआ है और कोई भी "ग्राफिक" कमांड सुनिश्चित है।
WM_CMD चर को कहां परिभाषित किया गया है? में crontab
लाइन:
@reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null
लेकिन मुझे यह भी लगता है कि अन्य सिस्टम अनुरोधों के माध्यम से "विंडोज़ प्रबंधक कमांड" का पता लगाना संभव होगा। हालांकि, मेरे लिए crontab फ़ाइल में WM_CMD को परिभाषित करना पर्याप्त है।
lightdm