उपयोगकर्ता का डेस्कटॉप लोड होने पर स्क्रिप्ट से कैसे पता लगाया जाए?


11

मेरे पास एक डेमॉन है, जिसे बैश में लागू किया गया है 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 को परिभाषित करना पर्याप्त है।


आप किस लॉगिन मैनेजर का उपयोग कर रहे हैं?
mtahmed

मेरा लॉगिन प्रबंधक हैlightdm
Peregring-lk

यह सुपर यूजर प्रश्न आपकी मदद के लिए हो सकता है। मुझे यकीन नहीं है कि यह आपके सवाल का पूरी तरह से जवाब देगा।
रानी अलबेग वेन

1
यह विशेष रूप से मजबूत नहीं है, लेकिन आप Gnome / KDE प्रक्रिया के लिए जांच कर सकते हैं ...
jasonwryan

1
आपको एक दस्तावेज के रूप में दस्तावेज करना चाहिए जो आपने उत्तर के रूप में दिया था; यह दूसरों की सहायता कर सकता है।
jasonwryan

जवाबों:


2

logindसेवा से सत्र जानकारी की क्वेरी करने के लिए D- बस का उपयोग करने का प्रयास करें । इसमें org.freedesktop.login1.Managerकई सिग्नल जैसे SessionNewऔर के साथ इंटरफेस है SeatNeworg.freedesktop.login1.Seatऔर org.freedesktop.login1.Userइंटरफेस। यह सत्र / सीट / उपयोगकर्ता स्थिति प्राप्त करने में मदद कर सकता है।


1

आपके ~/.xprofileलिए कुछ ध्वज फ़ाइल बनाने के लिए लॉगिन सत्र स्टार्टअप स्क्रिप्ट का उपयोग करें । यह बनें ~/.xlogin_flag, फिर इसे तैयार, छुआ या हटाए जाने के लिए देखने के लिए inotifywatchपैकेज से आपकी अन्य स्क्रिप्ट में उपयोग करें inotify-tools


1

wकमांड का आउटपुट चेक करें । आपको लॉगिन @ फ़ील्ड में लॉगिन प्रकार (एक्स डिस्प्ले) दिखाई देगा।


1

मुझे लगता है कि X11 में एक उपयोगकर्ता जुड़ा हुआ है या नहीं, यह जांचने का सबसे सरल तरीका है कि $HOME/.xsession-errorsजब आप ग्राफ़िकल रूप से लॉगिन करते हैं, तब से लिखी जाने वाली प्रक्रियाओं की जाँच करें ।

अन्यथा केवल wकमांड का उपयोग करें , जैसा कि पहले से ही @Grzegorz द्वारा सुझाया गया है: यदि FROMस्तंभ के साथ शुरू होता है :तो यह एक ग्राफिकल सत्र है।


0

Lightdm के क्रम निर्देशिका में जाँच करें। Systemd और lightdm के साथ Arch पर, जब कोई उपयोगकर्ता लॉग इन करता है, तो एक xauthority फ़ाइल बन जाती है।

$ whoami
carl
$ sudo ls -al /run/lightdm/carl
total 4
drwx------ 2 carl    carl     60 Dec 11 19:40 .
drwx--x--x 8 lightdm lightdm 160 Dec 11 19:40 ..
-rw------- 1 carl    carl     55 Dec 11 19:40 xauthority

आप अपने लूप में कुछ इस तरह से परीक्षण कर सकते हैं।

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.