লিনাক্স 5 মিনিটের জন্য অলস থাকলে একটি কমান্ড কার্যকর করুন


16

আমি যেমন একটি কমান্ড কার্যকর করতে চাই

 notify-send 'a'

যদি আমার লিনাক্স মেশিনটি 5 মিনিটের জন্য অলস থাকে।

অলস দ্বারা, আমি একই জিনিসটির অর্থ স্ক্রিন সেভার যা সক্রিয় হয়ে যায় তা "নিষ্কলুষ" সংজ্ঞা দিতে ব্যবহৃত হয়।


ঠিক আছে, আপনি কি চেষ্টা করেছেন? গুগল কি বলেছে? আপনি কী কী স্ক্রিনসেভার এটি সনাক্ত করে তা জানার চেষ্টা করেছেন? এখানে প্রশ্ন পোস্ট করার আগে অনুসন্ধান করার জন্য সময় দিন এবং কীভাবে একটি ভাল প্রশ্ন জিজ্ঞাসা করবেন তা পড়ুন ।
টেরডন

আমি কেবল একটি প্রোগ্রাম খুঁজে পেয়েছি xautolockতবে এর কোনও উদাহরণ নেই

উত্তর:


20

আমি xprintidleএক্স অলস সময়টি বের করার জন্য ডাকা একটি প্রোগ্রাম ব্যবহার করি , যা আমি দৃ strongly়ভাবে অনুমান করছি যে স্ক্রীনসভার হিসাবে একই ডেটা উত্সটি ব্যবহার করে। 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 এমএস অফসেটটি পূর্বের উল্লিখিত কৌতূহলের কারণে যা এইরূপে xprintidleমৃত্যুদন্ড কার্যকর করার সময় সর্বদা "আসল" অলস সময়ের চেয়ে কিছুটা কম সময় ফিরে আসবে। এটি এই অফসেট ছাড়াই কাজ করবে এবং তারপরে এটি দ্বিতীয় সেকেন্ডের দশমাংশের জন্য আরও সঠিক হবে, তবে এটি xprintidleঅন্তর শেষ হওয়ার আগে শেষ মিলি সেকেন্ডের সময় খালিভাবে পরীক্ষাটি ট্রিগার করবে । কোনও উপায়ে পারফরম্যান্স হগ নয়, তবে আমি তা অবহেলা খুঁজে পাব।

আমি বেশ কিছু সময়ের জন্য পার্ল স্ক্রিপ্টে (একটি ইরসি প্লাগইন) অনুরূপ পন্থা ব্যবহার করেছি, তবে উপরেরটি কেবল লেখা হয়েছিল এবং লেখার সময় কয়েকটি ট্রায়াল রান ছাড়া সত্যই পরীক্ষা করা হয়নি।

এটি এক্স এর মধ্যে একটি টার্মিনালে চালিয়ে চেষ্টা করুন I টাইমআউটটি উদাহরণস্বরূপ, যেমন 5000 টি এমএস পরীক্ষার জন্য নির্ধারণ করা এবং এটি কীভাবে কাজ করে তা দেখার জন্য তথ্যমূলক আউটপুট পেতে 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 < 5অবধি 5 সেকেন্ড অবধি অতিক্রান্ত হওয়া অবধি চলেছে, কোন সময়ে এটি বলা শুরু করে now > 5, যার অর্থ 5+ সেকেন্ড অতিক্রান্ত হয়েছে।

দ্রষ্টব্য: আপনি notify-send 'a'উপরের উদাহরণটিতে আপনার অন্তর্ভুক্ত করতে পারেন ।

তথ্যসূত্র


-1

বিএসডি পোর্টস (প্যাকেজ সংগ্রহ) এর একটি প্রোগ্রাম রয়েছে যা এটি করতে পারে:
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

নোট করুন যে-প্রোগ্রামটিতে বাইনারিটির পুরো পথ থাকা দরকার যেমন এটি এক্সিকিউ () তে চলে গেছে।

$ xidle -timeout 120 -program "/usr/bin/xlock -mode pyro"  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.