यदि लिनक्स 5 मिनट के लिए निष्क्रिय है तो एक कमांड निष्पादित करें


16

मैं एक कमांड निष्पादित करना चाहूंगा जैसे कि

 notify-send 'a'

अगर मेरी लिनक्स मशीन 5 मिनट के लिए निष्क्रिय हो गई है।

निष्क्रिय होने से मेरा मतलब वही है जो एक स्क्रीन सेवर सक्रिय हो जाता है जो "निष्क्रिय" को परिभाषित करने के लिए उपयोग करेगा।


ठीक है, आपने क्या कोशिश की है? गूगल ने क्या कहा? क्या आपने यह पता लगाने का प्रयास किया है कि स्क्रीनसेवर इसका पता कैसे लगाता है? कृपया यहां प्रश्न पोस्ट करने से पहले खोज करें और एक अच्छा प्रश्न कैसे पूछें के माध्यम से पढ़ें ।
टेराडॉन

मुझे केवल एक कार्यक्रम मिला xautolockलेकिन इसके कोई उदाहरण नहीं हैं

जवाबों:


20

मैं xprintidleएक्स बेकार समय का पता लगाने के लिए एक कार्यक्रम का उपयोग करता हूं, जिसका मैं दृढ़ता से अनुमान लगा रहा हूं स्क्रीनसेवर के समान डेटा स्रोत का उपयोग करता है। xprintidleवास्तव में अब एक अपस्ट्रीम नहीं लगता है, लेकिन डेबियन पैकेज जीवित और अच्छी तरह से है।

यह एक बहुत ही सरल अनुप्रयोग है: यह अंतिम एक्स इंटरैक्शन के बाद से मिलीसेकंड की राशि लौटाता है:

$ sleep 1 && xprintidle
940
$ sleep 5 && xprintidle
4916
$ sleep 10 && xprintidle
9932

(नोट: अंतर्निहित प्रणाली के कारण, यह एमएस में "वास्तविक" निष्क्रिय समय की तुलना में थोड़ा कम लगातार मूल्य देगा)।

आप इसका उपयोग स्क्रिप्ट बनाने के लिए कर सकते हैं, जो ई-मेल के माध्यम से निष्क्रिय समय के पांच मिनट के बाद एक निश्चित क्रम चलाता है:

#!/bin/sh

# Wanted trigger timeout in milliseconds.
IDLE_TIME=$((5*60*1000))

# Sequence to execute when timeout triggers.
trigger_cmd() {
    echo "Triggered action $(date)"
}

sleep_time=$IDLE_TIME
triggered=false

# ceil() instead of floor()
while sleep $(((sleep_time+999)/1000)); do
    idle=$(xprintidle)
    if [ $idle -ge $IDLE_TIME ]; then
        if ! $triggered; then
            trigger_cmd
            triggered=true
            sleep_time=$IDLE_TIME
        fi
    else
        triggered=false
        # Give 100 ms buffer to avoid frantic loops shortly before triggers.
        sleep_time=$((IDLE_TIME-idle+100))
    fi
done

100 एमएस ऑफ़सेट पहले से उल्लेखित quirk के कारण है xprintidle हमेशा इस तरह से निष्पादित होने पर "वास्तविक" निष्क्रिय समय की तुलना में थोड़ा कम समय लौटाएगा। यह इस ऑफसेट के बिना काम करेगा, और फिर एक सेकंड के दसवें हिस्से के लिए अधिक सटीक होगा, लेकिन यह xprintidleअंतराल के अंत से पहले अंतिम मिलीसेकंड के दौरान चेक को ट्रिगर करेगा । किसी भी तरह से एक प्रदर्शन हॉग नहीं है, लेकिन मुझे वह अपात्र मिलेगा।

मैंने काफी समय से एक पर्ल स्क्रिप्ट (एक इरसी प्लगइन) में इसी तरह के दृष्टिकोण का उपयोग किया है, लेकिन ऊपर सिर्फ लिखा गया था और लेखन के दौरान कुछ परीक्षण रन के अलावा वास्तव में परीक्षण नहीं किया गया है।

X के भीतर एक टर्मिनल में इसे चलाकर देखें। मैं परीक्षण के लिए उदाहरण के लिए 5000 ms को टाइमआउट सेट करने की सलाह देता हूं, और यह कैसे काम करता है, यह देखने के लिए सूचनात्मक आउटपुट प्राप्त करने के लिए set -xसीधे नीचे जोड़ #!/bin/shरहा है।


5

मैं xssstateऐसे उद्देश्यों के लिए उपयोग करता हूं । यह डेबियन या उबंटू , या अपस्ट्रीम में suckless-toolsपैकेज में उपलब्ध है

फिर आप निम्नलिखित शेल स्क्रिप्ट का उपयोग कर सकते हैं:

#!/bin/sh

if [ $# -lt 2 ];
then
    printf "usage: %s minutes command\n" "$(basename $0)" 2>&1
    exit 1
fi

timeout=$(($1*60*1000))
shift
cmd="$@"
triggered=false

while true
do
    tosleep=$(((timeout - $(xssstate -i)) / 1000))
    if [ $tosleep -le 0 ];
    then
        $triggered || $cmd
        triggered=true
    else
        triggered=false
        sleep $tosleep
    fi
done

1

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

$ more xidle.c 
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/scrnsaver.h>

/* Report amount of X server idle time. */
/* Build with- */
/* cc xidle.c -o xidle -lX11 -lXext -lXss */


int main(int argc, char *argv[])
{
    Display *display;
    int event_base, error_base;
    XScreenSaverInfo info;
    float seconds;

    display = XOpenDisplay("");

    if (XScreenSaverQueryExtension(display, &event_base, &error_base)) {
    XScreenSaverQueryInfo(display, DefaultRootWindow(display), &info);

    seconds = (float)info.idle/1000.0f;
    printf("%f\n",seconds);
    return(0);
    }
    else {
    fprintf(stderr,"Error: XScreenSaver Extension not present\n");
    return(1);
    }
}

इसे बनाने के लिए युगल पुस्तकालयों की आवश्यकता है। अपने फेडोरा 19 सिस्टम पर मुझे निम्नलिखित पुस्तकालयों की आवश्यकता थी:

$ rpm -qf /lib64/libX11.so.6 /lib64/libXext.so.6 /lib64/libXss.so.1
libX11-1.6.0-1.fc19.x86_64
libXext-1.3.2-1.fc19.x86_64
libXScrnSaver-1.2.2-5.fc19.x86_64

एक बार ये स्थापित हो जाने के बाद मैंने उपरोक्त को इस तरह संकलित किया:

$ gcc xidle.c -o xidle -lX11 -lXext -lXss

आप देख सकते हैं कि यह सेकंड की संख्या को रिपोर्ट करने में सक्षम है जो एक्स को इस तरह से चलाकर निष्क्रिय समय के रूप में पहचान रहा है:

$ while [ 1 ]; do ./xidle ; sleep 2;done
0.005000
1.948000
3.954000
5.959000
7.965000
0.073000   <--- moved the mouse here which resets it
0.035000

इस निष्पादन योग्य का उपयोग करके आप एक स्क्रिप्ट रख सकते हैं जो इस तरह से कुछ कर सकती है, द्वारा रिपोर्ट किए गए निष्क्रिय समय की निगरानी करना xidle

$ while [ 1 ]; do idle=$(./xidle); 
    [ $( echo "$idle > 5" | bc ) -eq 0 ] && echo "still < 5" || echo "now > 5"; 
    sleep 2;
done
still < 5
still < 5
still < 5
now > 5
now > 5
still < 5
still < 5
still < 5

उपरोक्त शो still < 55 सेकंड तक बेकार समय बीत चुका है, जिस बिंदु पर यह कहना शुरू करता है now > 5, जिसका अर्थ है कि 5+ सेकंड बीत चुके हैं।

नोट: आप अपने notify-send 'a'उदाहरण में शामिल कर सकते हैं ।

संदर्भ


-1

bsd पोर्ट (संकुल संग्रह) में एक प्रोग्राम है जो यह कर सकता है:
http://man.openbsd.org/OpenBSD-current/man1/xidle.1
यह यहां उपलब्ध है जैसे: http :
//distcache.freebsd.org.local- distfiles / उपन्यास / xidle-26052015.tar.bz2

जैसे निर्माण:

 # apt-get install libxss-dev # for include/X11/extensions/scrnsaver.h
 # gcc -o /usr/local/bin/xidle xidle.c -lX11 -lXss

ध्यान दें कि -program को बाइनरी में पूर्ण पथ समाहित करने की आवश्यकता है, क्योंकि इसे निष्पादित () करने के लिए पारित किया गया है।

$ xidle -timeout 120 -program "/usr/bin/xlock -mode pyro"  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.