প্রতি X সেকেন্ডে কমান্ড সঞ্চালন করুন


10

আমি কোনও কমান্ডটি 10 ​​সেকেন্ডে সম্পাদন করতে চাই এবং এটি ব্যাকগ্রাউন্ডে কার্যকর করা হয়েছে (এর মাধ্যমে মুছে ফেলা হচ্ছে watch?) সমস্ত উত্তর নীচের মত কিছু দেখায়, কিন্তু এটি 11 থেকে 14 সেকেন্ডে কার্যকর হবে। এই কিভাবে এটি করা সম্ভব?

while true; do
    # perform command that takes between 1 and 4 seconds
    sleep 10
done

রিয়েল-টাইম সংকেত সহ হতে পারে। এবং লিপ সেকেন্ডের সঠিক পরিচালনা। শুভকামনা
মাইকজার্ভ

@ মিমকিজার তাই, চেষ্টা করে বিরক্ত করবেন না? আমি মিলি-সেকেন্ডের নির্ভুলতার বিষয়ে চিন্তা করি না, কেবল অর্ধেক সেকেন্ড বলি।
ব্যবহারকারী 1032531

তুমি অর্জন করার জন্য কি চেষ্টা করতেছ? আমি দেখতে পেয়েছি যে এই ধরণের ফ্রিকোয়েন্সি নিয়ে যে কাজটি চালাতে হয় তা হ'ল সাধারণত অন্য সমস্যার জন্য কাজ করা।
সোব্রিক

নিখুঁতভাবে আমি একটি পোলিং ডেটা লগার ধারণা ধারণার প্রমাণ করছি। বাস্তবে, এটি অন্য কোনও ভাষায় প্রোগ্রাম করা হবে, তবে এটি আপাতত কার্যকর হয়।
ব্যবহারকারী 1032531

উত্তর:


16

কেমন:

( # In a subshell, for isolation, protecting $!
  while true; do
    perform-command & # in the background
    sleep 10 ;
    ### If you want to wait for a perform-command
    ### that happens to run for more than ten seconds,
    ### uncomment the following line:
    # wait $! ;
    ### If you prefer to kill a perform-command
    ### that happens to run for more than ten seconds,
    ### uncomment the following line instead:
    # kill $! ;
    ### (If you prefer to ignore it, uncomment neither.)
  done
)

ইটিএ: এই সমস্ত মন্তব্য, বিকল্প এবং অতিরিক্ত সুরক্ষার জন্য সাবশেলের সাথে, এটি শুরু হওয়ার চেয়ে সম্পূর্ণ জটিল দেখায়। সুতরাং, তুলনা জন্য, এখানে এটা কিসের মত আগে আমি সম্পর্কে উদ্বেজক শুরু লাগছিল এর waitবা killতাদের সঙ্গে $!বিচ্ছিন্নতার জন্য এবং প্রয়োজন:

while true; do perform-command & sleep 10 ; done

যখন আপনার প্রয়োজন হয় তখন বাকীটি সত্যই।


আপনি কি আপনার কোড ডাম্পের পিছনে যুক্তি ব্যাখ্যা করতে পারেন?
ইসমাইল মিগুয়েল

2
এছাড়াও, আপনার কোডটি কোন শেলটি (মাইকজার্জের উত্তরের মতো) কাজ করে তা উদ্ধৃত করার জন্য যাতে কোনও আলাদা শেল অন্যরকম আচরণ করে তখন লোকেরা বিভ্রান্ত হয় না :)
ছাই

@ ইসমাইল মিগুয়েল আমি মন্তব্যগুলি যুক্তি দিয়ে ব্যাখ্যা করব। আমি নিশ্চিত কি অস্পষ্ট।
সিধেকিন

1
বাশ ম্যানুয়ালটির সম্পর্কে বলা হয়েছে $!: "সর্বাধিক পটভূমিতে স্থাপন করা কাজের প্রসেস আইডি প্রসারিত করে" এবং sleepএটি ব্যাকগ্রাউন্ডে স্থাপন করা হয় না, তাই না, এটি হবে না। :)
সিডহেকিন

1
কি দারুন. উভয় গণনা ভুল। ওটা কখন ঘটেছিল?
মাইকজার্ভ

9

আপনি ভালো কিছু নিচের কাজগুলো করতে পারেন bash, zshঅথবা ksh:

SECONDS=0
while   command
do      sleep "$((10-(SECONDS%10)))"
done

bashম্যানুয়ালটি সম্পর্কে যা বলেছে তা এখানে $SECONDS:

$SECONDS

  • প্রতিবার এই প্যারামিটারটি রেফারেন্স করা হয়, শেল ডাকে অনুরোধ করার পরে সেকেন্ডের সংখ্যা। যদি কোনও মান নির্ধারিত হয় $SECONDS, পরবর্তী রেফারেন্সগুলিতে প্রত্যাবর্তিত মান হ'ল অ্যাসাইনমেন্ট প্লাস নির্ধারিত মান থেকে সেকেন্ডের সংখ্যা। যদি $SECONDSহয় unset, এটা তার বিশেষ বৈশিষ্ট্য হারায়, যদিও তা পরবর্তীকালে রিসেট হয়।

এখানে একটি কার্যকারী উদাহরণ:

(   SECONDS=0
    while   sleep   "$((RANDOM%10))"
    do      sleep   "$((10-(SECONDS%10)))"
            echo    "$SECONDS"
    done
)

10
20
30
40
50
60
70
80
90
100

2
রিসেট এড়াতে SECONDSকরণীয় sleep "$((10-(($SECONDS-$start_time)%10)))"start_time=$SECONDSলুপ করার আগে আপনাকে করতে হবে ।
ctrl-alt-delor 21

@রিচার্ড - কেন এড়াবেন?
মাইকজার্ভ

কারণ একদিন আপনার কাছে এমন কোনও স্ক্রিপ্ট থাকবে যা আপনি যেমন লুপ দিয়ে কল করেছেন। এবং কেন আপনি সঠিকভাবে কাজ করছেন না তা ভেবে সারা দিন ব্যয় করবেন spend সংক্ষেপে, আপনি পুনরায় সেট করলে এটি বাসা বাঁধে না SECONDS। আপনার সর্বশেষ সম্পাদনার মতো সাব-শেল তৈরি করাও এই সমস্যাটি এড়ানো উচিত।
ctrl-alt-delor

1
@ রিচার্ড - যেহেতু প্রশ্নটি একটি while trueলুপ সম্পর্কিত ছিল আমি কোনও শেল রাষ্ট্র বেঁচে থাকার আশা করিনি। তার নিজস্ব প্রসঙ্গে লুপটি মোড়ানো সাধারণত সর্বোত্তম অনুশীলন, যাইহোক। যদিও এমন পরিস্থিতিতে আমি trap'স্বার্থে নয়' এর চেয়ে বেশি করার জন্য উদ্বিগ্ন হব $SECONDS
মাইকজার্ভ

ধন্যবাদ মাইক, আমি অনুরূপ কিছু করার কথা ভাবছিলাম (তবে কীভাবে তা সুনির্দিষ্টভাবে জানা যায়নি)। কিন্তু সিধেকিনের সমাধানটি একই জিনিসটি মনে হচ্ছে, না? আমি উত্তম উত্তরের উপর রায় দেওয়ার জন্য যোগ্য নই, তবে কিছু বাছাই করার দায়বদ্ধ বোধ করেছি।
ব্যবহারকারী 1032531

3

কেবলমাত্র বাস - আপনি আপনার আদেশ দ্বারা ব্যয় করা সময় গণনা করতে এবং 10 থেকে বিয়োগ করতে পারেন:

TIMEFORMAT=$'%0R'
while true; do
    T=$({ time command; } 2>&1)
    sleep $(( 10-T ))

বেস মানুষ থেকে:

টাইমফর্ম্যাট এই প্যারামিটারটির মান একটি ফর্ম্যাট স্ট্রিং হিসাবে ব্যবহৃত হয় তা নির্দিষ্ট করে যে কীভাবে সময় সংরক্ষিত শব্দের সাথে উপস্থাপিত পাইপলাইনের সময়সীমা তথ্য প্রদর্শিত হবে। % চরিত্রটি একটি পালানোর ক্রমটি প্রবর্তন করে যা সময়ের মান বা অন্যান্য তথ্যে প্রসারিত হয়। অব্যাহতি ক্রম এবং তাদের অর্থ নীচে রয়েছে; বন্ধনীগুলি alচ্ছিক অংশগুলি বোঝায়।
%% আক্ষরিক%।
% [পি] [l] আর সেকেন্ডের মধ্যে সময় অতিবাহিত।
% [p] [l] U ব্যবহারকারী মোডে ব্যয় হওয়া সিপিইউ সেকেন্ডের সংখ্যা।
% [পি] [l] এস সিস্টেম মোডে ব্যয় হওয়া সিপিইউ সেকেন্ডের সংখ্যা।
% P সিপিইউ শতাংশ, (% ইউ +% এস) /% আর হিসাবে গণনা করা হয়।

Alচ্ছিক পি হ'ল একটি অঙ্ক যা স্পষ্টতা নির্দিষ্ট করে, দশমিক বিন্দুর পরে ভগ্নাংশের সংখ্যার সংখ্যা। 0 এর মানের ফলে দশমিক বিন্দু বা ভগ্নাংশ আউটপুট হয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.