मैं एक कमांड निष्पादित करना चाहूंगा जैसे कि
notify-send 'a'
अगर मेरी लिनक्स मशीन 5 मिनट के लिए निष्क्रिय हो गई है।
निष्क्रिय होने से मेरा मतलब वही है जो एक स्क्रीन सेवर सक्रिय हो जाता है जो "निष्क्रिय" को परिभाषित करने के लिए उपयोग करेगा।
मैं एक कमांड निष्पादित करना चाहूंगा जैसे कि
notify-send 'a'
अगर मेरी लिनक्स मशीन 5 मिनट के लिए निष्क्रिय हो गई है।
निष्क्रिय होने से मेरा मतलब वही है जो एक स्क्रीन सेवर सक्रिय हो जाता है जो "निष्क्रिय" को परिभाषित करने के लिए उपयोग करेगा।
जवाबों:
मैं 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
रहा है।
मैं 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
यहां एक सी एप्लिकेशन है जो मुझे मिली जिसे आप संकलित कर सकते हैं।
$ 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 < 5
5 सेकंड तक बेकार समय बीत चुका है, जिस बिंदु पर यह कहना शुरू करता है now > 5
, जिसका अर्थ है कि 5+ सेकंड बीत चुके हैं।
नोट: आप अपने notify-send 'a'
उदाहरण में शामिल कर सकते हैं ।
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"