সিস্টেম নিষ্ক্রিয় থাকে এবং কখন আবার সক্রিয় থাকে তখন একটি কমান্ড চালান


15

ব্যবহারকারী নিষ্ক্রিয় হয়ে পড়লে আমি একটি কমান্ড চালাতে চাই (সিস্টেমটি নিষ্ক্রিয়)। উদাহরণ স্বরূপ:

echo "You started to be inactive."

এছাড়াও, যখন ব্যবহারকারী আবার সক্রিয় হয় (সিস্টেমটি আর নিষ্ক্রিয় থাকে না):

echo "You started to be active, again."

আমার একটি শেল স্ক্রিপ্ট দরকার যা এটি করবে। এটি কি টাইমার / অন্তর ছাড়াই সম্ভব? কিছু সিস্টেম ইভেন্ট হতে পারে?


2
আপনি আসলে যা অর্জন করতে চান সে সম্পর্কে আপনি কি কিছুটা গভীরতর বিশদে যেতে পারেন?
নীল

3
আপনি অলসতা কীভাবে পরিমাপ করবেন? কোনও ব্যবহারকারী কি মুভি অলস দেখছেন (কারণ তিনি কম্পিউটারের সাথে ইন্টারঅ্যাক্ট করছেন না)? ব্যবহারকারী যে দূর থেকে সক্রিয় আছেন?
গিলস

আমি যা জানি, সিস্টেমে এই অন্তর্নিহিত ধারণাটি রয়েছে: নিষ্ক্রিয় , সক্রিয় ইত্যাদি কি এটি সঠিক?
আয়নিক বিজাউ

@ আয়নিকবিজাউ: আসলে না। সিস্টেমের প্রসঙ্গে অলসতার অর্থ কেবল সমস্ত প্রক্রিয়া ঘুমিয়ে আছে, এটি 'কোনও কিছুর জন্য অপেক্ষা'। যদিও এটি আধুনিক সিস্টেমে প্রায়শই ঘটতে পারে এবং বেশিরভাগ সময় এমনটি হতে পারে, তবে সবসময় কিছু করার থাকে এবং এটি যদি ঘড়ির আপডেট করে থাকে তবে এটি দীর্ঘকাল ধরে থাকে না। অলসতা , বিশেষত আপনার প্রশ্নের প্রসঙ্গে, সিস্টেমের চেয়ে ব্যবহারকারীর আরও বেশি কার্যকারিতা এবং এমনকি এটি সাধারণত নির্দিষ্ট সেশনের সাথে যুক্ত থাকে।
অ্যাডাইফোন

@ আদাফোন ঠিক আছে আমার ধারণায়, যখন ব্যবহারকারী কম্পিউটারে x মিনিটের জন্য কোনও ক্রিয়া (মাউস মুভ, ক্লিক, কী প্রেস) না করে তখন একটি সিস্টেম অলস থাকে । সিস্টেমটি সক্রিয় হয়ে ওঠে যখন ব্যবহারকারী প্রথম ক্রিয়া করে: মাউস বোতামটি ক্লিক করে, এটিকে সরিয়ে দেয়, একটি কী টিপে দেয়। শেল স্ক্রিপ্ট ব্যবহার করে এই নিষ্ক্রিয় * / * সক্রিয় রাষ্ট্রগুলি সনাক্ত করা কি সম্ভব ?
আয়নিক বিজাউ 11

উত্তর:


17

আর্কলিনাক্স ফোরামের এই থ্রেডটিতে একটি সংক্ষিপ্ত সি প্রোগ্রাম রয়েছে যা ব্যবহারকারীর কতক্ষণ নিষ্ক্রিয় থাকবে এমন তথ্যের জন্য 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, যা বেশিরভাগ বিতরণে পাওয়া যায় এবং ঠিক একই জিনিসটি করে does
দাঙ্গা

3

টিএমওআউটে ব্যাশ সেকেন্ডের সেট সংখ্যার পরে একটি ইন্টারেক্টিভ সেশনটি শেষ করবে। আপনি যে প্রক্রিয়া ব্যবহার করতে পারেন।

আপনি একটি নির্দিষ্ট ফাঁদ সেট করে (আমি এটি পরীক্ষা করিনি) বা ব্যাশ-লগআউট-স্ক্রিপ্টগুলি (the / .bash_logout) ব্যবহার করে লগআউট ক্যাপচার করেন th

এখানে সেই দিকটিতে একটি ভাল সুপার-উত্তর দেওয়া হয়েছে।


এটি $TMOUTসেকেন্ড কেটে যাওয়ার পরে লগ আউট না করে ব্যবহারকারী কীভাবে কোনও আদেশ ব্যবহার করবে তা সম্বোধন করে না ।
চিপনার

আপনি কি আপনার উত্তরে আরও তথ্য যুক্ত করতে পারেন? এটি এখনও আমার কাছে অস্পষ্ট ...
আয়নিক বিজাউ

@ চেপারার আমি আমার উত্তরে আরও কিছু বিশদ যুক্ত করেছি।
নিলস

যে কোনও উপায়ে, সময় শেষ হওয়ার পরে এটি কেবল ব্যবহারকারীকে লগ আউট করে। আমি মনে করি না ল্যাপ আউট করার কোনও উপায় আছে, হয় কোনও EXITফাঁদ থেকে বা থেকে .bash_logout
চিপনার

3

এটি আপনি যা চেয়েছিলেন তা পুরোপুরি নয়, তবে সর্বদা- batchকম্যান্ড (সাধারণত-কম্যান্ডের একটি বিশেষ প্রার্থনা atএবং atd-ডেমন ব্যবহার করে ) থাকে।

batchনির্দিষ্ট সীমাটির নিচে লোড-এভারেজ ড্রপ হলে সাধারণত চালানোর জন্য একটি কমান্ড আপ করতে দেয় (সাধারণত 1.5, তবে এটি শুরু করার পরে সেট করা যেতে পারে atd)। সঙ্গে atএটাও এমনভাবে একটা চাকরি সূত্র সম্ভব যে বরং একটি নির্দিষ্ট সময়ে চালানো হচ্ছে চেয়ে; সেই batchসময় সবেমাত্র কাজটি সরবরাহ করা হয়, এবং লোড-এভারেজ ড্রপ হওয়ার পরে প্রথম চালান (উদাহরণস্বরূপ, এটি সকাল 2:00 টার কিছু পরে লোড-গড় 1.5 এর নীচে নেমে যাওয়ার সাথে সাথে চালানো হবে)।

দুর্ভাগ্যক্রমে একটি ব্যাচ-জব তখন শেষ হয়ে যাবে, কম্পিউটারটি আর অলস না থাকলে এটি থামবে না।

+++

আপনি প্রোগ্রামিং-রুট (যা এটি অন্যান্য উত্তর থেকে মত দেখায়) যেতে থাকে, তাহলে আমি মনে করি অনুরূপ কিছু করার চেষ্টা করতাম atdবা crondডেমন, নজর দেওয়া যে লগ-ইন ব্যবহারকারী এবং / অথবা লোড গড়। এই ডিমনটি তখন একটি নির্দিষ্ট ডিরেক্টরি থেকে স্ক্রিপ্ট / প্রোগ্রাম চালাতে পারে এবং প্রয়োজনীয় (সিগন্যাল সহ) এগুলি শুরু / চালিয়ে বা বন্ধ করতে পারে needed


আপনি যদি এটি করেন এবং .lockফাইলগুলি ব্যবহার করেন তবে আপনি সহজেই সময় সংক্রান্ত সমস্যাগুলি পরিচালনা করতে পারেন।
মাইকজারভেল

2

কীবোর্ড এবং মাউস ক্রিয়াকলাপ সনাক্ত করার উপর ভিত্তি করে এই থ্রেডটিতে বেশ কয়েকটি সমাধান রয়েছে। আমি xprintidleক্রোন জব থেকে চালিয়ে যা প্রতি কয়েক মিনিট পরে শুরু হয়। তবে তারা যেমনটি নির্দেশ করেছে xprintidleতেমন চালিত নয়, সুতরাং আপনি পার্ল মডিউলটি ইনস্টল করতে পারেন এবং পরিবর্তে এটি ব্যবহার করতে পারেন:

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

আমি ক্রোন থেকে ভোটদানের মাধ্যমে সমাধানটি ব্যবহার করব, স্ক্রিপ্টে যা ইউআই পর্যাপ্তভাবে নিষ্ক্রিয় না হলে শীর্ষে প্রস্থান করে। export DISPLAY=:0.0এক্স 11 এর সাথে কথা বলার জন্য অবশ্যই স্ক্রিপ্টটির একটি প্রয়োজন হবে ।

মনে রাখবেন যে মুভি দেখার সময়, বা সিপিইউ-ভারী কোনও কাজ চালানোর সময় আপনার কীবোর্ড এবং মাউস নিষ্ক্রিয় থাকতে পারে।


1

আমি এই পদ্ধতিটি কোনওরকম সিস্টেমের পরিসংখ্যানকে পোলিং না করেই করার উপায় জানি না, যেমন অন্যান্য উত্তরগুলির মতো স্ক্রিনসেভার বা ব্যাশ নিষ্ক্রিয় টাইমার ব্যবহার করে বা .বাশ_লগআউট থেকে চালানো, তবে সিপিইউ ব্যবহার পরীক্ষা করার জন্য এখানে একটি ধারণা।

এটি এখনও প্রতি এন সেকেন্ডে পোলিংয়ের সাথে জড়িত থাকবে এবং যদি আপনার সিপিইউ ব্যবহারটি আপনি যে পরিমাণ পরিমাণ চয়ন করেন তার অধীনে থাকে তবে আপনি যা চালাতে চান তা স্ক্রিপ্ট করতে পারবেন। যাইহোক, আপনি যা কিছু চালান তা সিপিইউ ব্যবহার বাড়িয়ে তুলতে পারে তবে এটি গণনা না করতে আপনি আপনার "স্টাফ" তে দুর্দান্ত ব্যবহার করতে পারেন।

এখানে শীর্ষ ব্যবহার করে একটি পরীক্ষা স্ক্রিপ্ট রয়েছে, তবে আপনি পরিবর্তে এমপিস্ট্যাট ব্যবহার করতে পারেন, বা পরিবর্তে লোড গড় পরীক্ষা করতে পারেন?

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), প্রথমবারে মনে হয় এটি কখনও কখনও সিপাস্ট্যাটগুলি পরিবর্তন করে না, যেন এটি নিজেই পার্স / প্রোক / স্ট্যাট অপেক্ষা করতে হবে, সুতরাং top -bn2তত্ত্বটি কিন্তু top -bn1কাজ করা উচিত।


উঃ ... সত্যি? সিপিইউ পরিসংখ্যান পোলিং?
রোল্ফ

যাইহোক, আপনি wকমান্ডটি পোল করতে পারেন যা ব্যবহারকারীর নিষ্ক্রিয় সময় দেখায়। - আমি যেভাবে বিচার করছি না, এটি কেবল আমার পক্ষে, আমি ঘুমাতে, বিদ্যুত্প্রকাশের জন্য মেশিনটি রাখার জন্য অলস সনাক্ত করতে চাই এবং ভোটগ্রহণ তার বিপরীতে চলে।
রোল্ফ

@ রোল্ফ মনে হচ্ছে বেশ বিচার হচ্ছে ... যেহেতু এই মন্তব্যটি আসলে খুব বেশি যোগ করে না এটি সম্ভবত মুছে ফেলা উচিত, হ্যাঁ? যাইহোক, অন্যান্য উত্তরগুলি অবিচ্ছিন্ন সময় কয়েকটি ভিন্ন উপায়ে ব্যবহার করে তবে আপনি সিস্টেমটিকে না দেখে / জিজ্ঞাসা না করে কীভাবে অলস সনাক্ত করতে পারেন?
Xen2050
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.