जब सिस्टम निष्क्रिय हो और जब फिर से सक्रिय हो तो एक कमांड चलाएँ


15

जब उपयोगकर्ता निष्क्रिय हो जाता है तो मैं एक कमांड चलाना चाहता हूं (सिस्टम निष्क्रिय है)। उदाहरण के लिए:

echo "You started to be inactive."

इसके अलावा, जब उपयोगकर्ता फिर से सक्रिय हो जाता है (सिस्टम अब निष्क्रिय नहीं है):

echo "You started to be active, again."

मुझे एक शेल स्क्रिप्ट की जरूरत है जो ऐसा करेगी। क्या यह बिना टाइमर / अंतराल के संभव है? शायद कुछ सिस्टम ईवेंट?


2
क्या आप वास्तव में जो आप हासिल करना चाहते हैं, उसके बारे में थोड़ा और विस्तार में जा सकते हैं?
निल्स

3
आप आलस्य को कैसे मापते हैं? क्या कोई उपयोगकर्ता मूवी बेकार देख रहा है (क्योंकि वह कंप्यूटर से इंटरैक्ट नहीं कर रहा है)? क्या कोई उपयोगकर्ता जो दूरस्थ रूप से सक्रिय है, लॉग इन है?
गाइल्स 'एसओ- बुराई को रोकें'

मुझे जो पता है, उससे सिस्टम में यह अंतर्निहित अवधारणा है: निष्क्रिय , सक्रिय आदि। क्या यह सही है?
आयनॉ बिज़ुआ

@ IonicăBizău: वास्तव में नहीं। सिस्टम के संदर्भ में आइडल का केवल यही अर्थ होगा कि सभी प्रक्रियाएं सो रही हैं, वह है 'किसी चीज की प्रतीक्षा'। हालांकि यह एक आधुनिक प्रणाली पर काफी बार हो सकता है और यहां तक ​​कि ज्यादातर समय ऐसा हो सकता है, लेकिन यह उस तरह से लंबे समय तक नहीं रहता है क्योंकि हमेशा कुछ किया जाना है और अगर यह घड़ी को अपडेट कर रहा है। निष्क्रियता , विशेष रूप से आपके प्रश्न के संदर्भ में, सिस्टम की तुलना में उपयोगकर्ता का अधिक कार्य है और यहां तक ​​कि आमतौर पर एक विशिष्ट सत्र से जुड़ा हुआ है।
आदैफॉन

@ अडेपोन ओके। मेरी अवधारणा में, एक सिस्टम निष्क्रिय है जब उपयोगकर्ता एक्स मिनट के लिए कंप्यूटर पर कोई भी कार्रवाई (माउस चाल, क्लिक, कुंजी प्रेस) नहीं करता है । उपयोगकर्ता द्वारा पहली क्रिया करने पर सिस्टम सक्रिय हो जाता है : माउस बटन पर क्लिक करता है, इसे मूव करता है, एक कुंजी दबाता है और इसी तरह। क्या शेल स्क्रिप्ट का उपयोग करके इन निष्क्रिय * / * सक्रिय राज्यों का पता लगाना संभव है ?
इओनिया बिज़ुआ

जवाबों:


17

ArchLinux फ़ोरम के इस थ्रेड में एक छोटा C प्रोग्राम होता है, जो जानकारी के लिए xscreensaver पर सवाल करता है कि उपयोगकर्ता कितने समय से निष्क्रिय है, यह आपकी आवश्यकताओं के काफी करीब लगता है:

#include <X11/extensions/scrnsaver.h>
#include <stdio.h>

int main(void) {
    Display *dpy = XOpenDisplay(NULL);

    if (!dpy) {
        return(1);
    }

    XScreenSaverInfo *info = XScreenSaverAllocInfo();
    XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
    printf("%u\n", info->idle);

      return(0);
}

इसे सहेजें getIdle.cऔर इसके साथ संकलित करें

gcc -o getIdle getIdle.c -lXss -lX11

एक निष्पादन योग्य फ़ाइल प्राप्त करने के लिए getIdle। यह कार्यक्रम मिलीसेकंड में "निष्क्रिय समय" (उपयोगकर्ता मूव / माउस का उपयोग नहीं करता है, कीबोर्ड का उपयोग नहीं करता है) प्रिंट करता है, इसलिए इस पर बनने वाली बैश स्क्रिप्ट इस तरह दिख सकती है:

#!/bin/bash

idle=false
idleAfter=3000     # consider idle after 3000 ms

while true; do
  idleTimeMillis=$(./getIdle)
  echo $idleTimeMillis  # just for debug purposes.
  if [[ $idle = false && $idleTimeMillis -gt $idleAfter ]] ; then
    echo "start idle"   # or whatever command(s) you want to run...
    idle=true
  fi

  if [[ $idle = true && $idleTimeMillis -lt $idleAfter ]] ; then
    echo "end idle"     # same here.
    idle=false
  fi
  sleep 1      # polling interval

done

इसके लिए अभी भी नियमित रूप से मतदान की आवश्यकता है, लेकिन यह वह सब कुछ करता है जिसकी आपको आवश्यकता है ...


जैसा काम करता है! +1
आयनिक बिज़ु

आप अधिक अंक के लायक हैं!
आयनॉ बिज़ुउ

2
आप अपने स्वयं के कार्यक्रम को संकलित करने के लिए खुद को बचा सकते हैं और बस उपयोग कर सकते हैं xprintidle, जो कि अधिकांश वितरणों में उपलब्ध है और बिल्कुल यही काम करता है।
रायट

3

बैश में TM सेकंड के सेट की संख्या के बाद एक इंटरैक्टिव सत्र समाप्त कर देगा। आप उस तंत्र का उपयोग कर सकते हैं।

आप एक ट्रैप के अनुसार लॉगआउट पर कब्जा कर लेते हैं (मैंने परीक्षण नहीं किया है), या बैश-लॉगआउट-स्क्रिप्ट (~ / .bash_logout) का उपयोग करके।

यहाँ उस दिशा में एक अच्छा सुपरयूज़र-उत्तर है।


यह पता नहीं लगाता है कि $TMOUTसेकंड बीतने के बाद, उपयोगकर्ता लॉग आउट करने के बजाय एक कमांड कैसे निष्पादित करेगा ।
चेपनर

क्या आप अपने उत्तर में अधिक जानकारी जोड़ सकते हैं? यह मेरे लिए अभी भी अस्पष्ट है ...
Ionică Bizău

@chepner मैंने अपने उत्तर में कुछ और विवरण जोड़े हैं।
नेल्स

किसी भी तरह से, यह समय समाप्त होने के बाद उपयोगकर्ता को केवल लॉग आउट करता है। मुझे नहीं लगता कि लॉग आउट को समाप्त करने का कोई तरीका है, या तो EXITजाल से या .bash_logout
चेपनर

3

यह वह नहीं है जो आपने मांगा था, लेकिन हमेशा ऐसा है batch -command (आमतौर पर -comand का एक विशेष आह्वान atऔर -demon का उपयोग करके atd) है।

batch जब आप लोड-औसत ड्रॉप एक निश्चित सीमा (आमतौर पर 1.5 से कम है, लेकिन जब इसे शुरू किया जा सकता है, तो आपको कमांड को चलाने की आज्ञा देता है। atd ) के । इसके साथ atएक नौकरी को इस तरह से बनाना भी संभव है, जो एक निश्चित समय पर चलने के बजाय; नौकरी को केवल batchउस समय वितरित किया जाता है, और लोड-एवरेज ड्रॉप्स (जैसे। यह लोड-एवरेज ड्रॉप्स के तहत 1.5 के तहत कुछ समय बाद 2:00 बजे के बाद शुरू होता है)।

दुर्भाग्य से एक बैच-जॉब तब इसे समाप्त करने के लिए चलेगा, यह बंद नहीं होगा अगर कंप्यूटर अब-बेकार है।

+++

यदि आपको प्रोग्रामिंग-रूट पर जाना है (जो कि अन्य उत्तरों से दिखता है), तो मुझे लगता है कि मैं atdया crondडेमॉन के समान कुछ बनाने की कोशिश करूंगा , जो लॉग-इन उपयोगकर्ताओं और / या लोड-औसत की निगरानी करता है। यह डेमॉन तब एक निश्चित निर्देशिका से स्क्रिप्ट / कार्यक्रम चला सकता है, और आवश्यकतानुसार उन्हें (संकेतों के साथ) चालू / जारी या बंद कर सकता है।


यदि आपने ऐसा किया है और .lockफ़ाइलों का उपयोग किया है तो आप समय संबंधी समस्याओं को आसानी से संभाल सकते हैं।
mikeserv

2

इस धागे में कीबोर्ड और माउस गतिविधि का पता लगाने के आधार पर कुछ समाधान हैं। मैं xprintidleएक क्रॉन नौकरी से चलाता हूं जो हर कुछ मिनटों में शुरू होती है। लेकिन जैसा कि वे बताते हैं कि xprintidleयह अस्वीकार्य है, इसलिए आप पर्ल मॉड्यूल को स्थापित करना चाहते हैं और इसके बजाय इसका उपयोग कर सकते हैं:

$ cpanm X11::IdleTime
...
$ sleep 10; perl -MX11::IdleTime -le 'print GetIdleTime()'
9

मैं क्रॉन से मतदान करके या तो समाधान का उपयोग करूंगा, एक स्क्रिप्ट में जो शीर्ष पर बाहर निकलता है अगर यूआई पर्याप्त रूप से निष्क्रिय नहीं हुआ है। बेशक स्क्रिप्ट की जरूरत होगीexport DISPLAY=:0.0 X11 पर बात करने के ।

याद रखें कि मूवी देखते समय, या सीपीयू-भारी कार्य चलाने पर आपका कीबोर्ड और माउस निष्क्रिय हो सकता है।


1

मैं किसी तरह के सिस्टम स्टैटस को परागण किए बिना ऐसा करने का तरीका नहीं जानता, जैसे अन्य उत्तर स्क्रीनसेवर या बैश आइडल टाइमर का उपयोग करते हैं, या .bash_logout से चल रहे हैं, लेकिन यहाँ CPU उपयोग की जांच करने का विचार है।

इसमें अभी भी प्रत्येक n सेकंड में मतदान शामिल होगा, और यदि आपका CPU उपयोग आपके द्वारा चुनी गई राशि के अंतर्गत है, तो आप जो भी चलाना चाहते हैं उसे स्क्रिप्ट कर सकते हैं। हालाँकि, जो भी आप चलाते हैं वह सीपीयू उपयोग बढ़ा सकता है, लेकिन आप इसे गिनने के लिए अपने "सामान" पर अच्छा उपयोग कर सकते हैं।

यहां शीर्ष का उपयोग करके एक परीक्षण स्क्रिप्ट दी गई है, लेकिन आप इसके बजाय mpstat का उपयोग कर सकते हैं, या इसके बजाय लोड औसत की जांच कर सकते हैं?

while true
do
idle=$(top -bn2 | grep "Cpu(s)"|tail -n 1|sed "s/.*, *\([0-9.]*\)%* id.*/\1/")
echo "idle is $idle"
if [[ $idle > 90 ]]
then
    echo "idle above 90%"
    echo "Do stuff now"
else
    echo "idle below 90%"
    echo "Stop doing stuff now"
fi
sleep 1
done

यह सिर्फ एक स्क्रिप्ट है जिसे मैंने ऊपर से बेकार पढ़ने के लिए एक साथ फेंक दिया। आप पार्स कर सकते हैं /proc/statलेकिन मुझे लगता है कि यह केवल कुल समय दिखाता है, और आपको अंतराल पर परिणामों की तुलना करने की आवश्यकता होगी। शीर्ष के लिए यह मेरे लिए खुद की समस्या है (लिनक्स टकसाल 16), पहली बार में यह लगता है कि यह कभी भी cpustats को नहीं बदलता है, जैसे कि इसे स्वयं पार्स / प्रोक / स्टेट करने के लिए इंतजार करना पड़ता है, इसलिए top -bn2सिद्धांत रूप में top -bn1काम करना चाहिए।


उह… सच में? सीपीयू आँकड़े मतदान?
रॉल्फ

वैसे, आप उस wकमांड को भी प्रदूषित कर सकते हैं जो उपयोगकर्ता के निष्क्रिय समय को दर्शाता है। - जिस तरह से मैं जज नहीं कर रहा हूं, यह सिर्फ मेरे लिए है, मैं मशीन को सोने के लिए, शक्ति को छोड़ने के लिए, और मतदान के लिए बेकार का पता लगाना चाहता हूं।
रॉल्फ

@ रॉल्फ बहुत जज लगता है ... क्योंकि यह टिप्पणी वास्तव में बहुत कुछ नहीं जोड़ती है, इसे शायद हटा दिया जाना चाहिए, हाँ? वैसे भी, अन्य उत्तर कुछ अलग तरीकों से निष्क्रिय समय का उपयोग करते हैं, लेकिन आप सिस्टम को देखे / पूछे बिना कैसे निष्क्रिय का पता लगा सकते हैं?
एक्सएन २०५०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.