কমান্ডের একটি নির্দিষ্ট সময় পেরিয়ে যাওয়ার পরে?


24

যদি আমি একটি দীর্ঘ প্রক্রিয়া সম্পাদন করি, তবে কোনও সময়-ভিত্তিক আদেশগুলি কার্যকর করতে পারে এমন কোনও উপায় আছে কি?

উদাহরণস্বরূপ, আমি একটি দীর্ঘ দীর্ঘ প্রক্রিয়া চালাচ্ছি যা প্রায় 10 মিনিটের জন্য চলে।

5 মিনিটের পরে, আমি একটি পৃথক কমান্ড চালাতে চাই। উদাহরণস্বরূপ, পৃথক কমান্ডটি হতে পারে:echo 5 minutes complete

(দ্রষ্টব্য: আমি কমান্ডটি সমাপ্তির দিকে অগ্রগতি চাই না, তবে কেবল নির্দিষ্ট সময়সীমার পরে কমান্ডগুলি কার্যকর করা হবে))

এটা কি সম্ভব?


1
বেশিরভাগ সময়, আপনি কোনও প্রক্রিয়া কতটা সময় নেবেন তা আগাম জানেন না।
চোরোবা

"সময় ভিত্তিক আদেশগুলি" বলতে কী বোঝ? আপনি কি একটি অগ্রগতি বার তৈরি করতে চান? আপনার প্রশ্নের বর্তমান শব্দবন্ধের উপর ভিত্তি করে আপনি ব্যাকগ্রাউন্ডে দীর্ঘ চলমান কমান্ডটি রেখে দিতে পারেন এবং তারপরে সিস্টেমের ঘড়িটি প্রদর্শন করতে পারেন। পরিষ্কার করে বলো.
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড আমি প্রশ্নে স্পষ্ট করেছিলাম। প্রগতিবার নয়। এটি কিছু বিরতি পরে আদেশগুলি কার্যকর করবে
অনিকেত ভট্টাচার্য

1
"5 মিনিট সম্পূর্ণ" প্রতিধ্বনিত করার একটি বিজোড় জিনিস। "5 মিনিট কেটে গেছে"? "সময় _____" না? আপনি কি নিশ্চিত করতে চান যে আপনার দীর্ঘ-চলমান কমান্ডটি শুরু হওয়ার আগে, অন্য কোনও স্বেচ্ছাসেবক কমান্ড চালুর আগেই কিছু নির্দিষ্ট সময়সীমা অতিক্রান্ত হয়েছে? যদি তাই হয় তবে শুধু চালাবেন না কেন longcommand & sleep 300 && command-to-do-after-five-minutes? (আসলে এটি সম্ভবত আপনি যা খুঁজছেন are) নোট করুন যে আপনার স্পষ্টতা যথেষ্ট ছিল না, যেহেতু আপনি ব্যাটের সামনে দুটি ঘড়ি-অগ্রগতি-বার বাস্তবায়ন পেয়েছিলেন।
ওয়াইল্ডকার্ড

উত্তর:


29

শুধু রান:

long-command & sleep 300; do-this-after-five-minutes

do-this-after-five-minutesপাঁচ মিনিট পরে চালানো হবে। long-commandপটভূমিতে চলমান করা হবে না।


10
আমি সাধারণত ব্যবহার করি sleep 5m && foobar, তাই আমি যদি আমার মন এবং ^ সি সি পরিবর্তন করি sleepতবে পরবর্তী কমান্ডটি চলবে না।
পিটার কর্ডেস

@ পিটারকর্ডস, যখন আমি উদাহরণ দিয়ে পরীক্ষা করেছি sleep 3; lsএবং ^C, দ্বিতীয় কমান্ড যাইহোক চলবে না। সত্যিই নিশ্চিত নয় কেন এবং সম্ভবত এটি একটি ইন্টারেক্টিভ শেলটিতে ভিন্নভাবে কাজ করে?
ওয়াইল্ডকার্ড

1
@ পিটারকর্ডস পুরোপুরি নয় - যদি না এটি শেলের জন্য আলাদা হয়। কখন sleep 5m && echoঘুমাচ্ছে, যখন আপনি স্থগিত করবেন, কেবলমাত্র sleepআদেশটি স্থগিত করা হবে। বাকি কমান্ড লাইনটি চলমান, তবে sleepস্থগিত হওয়ার পরে, এটি সফলভাবে প্রস্থান করতে পারেনি এবং তার পরের অংশটি &&বাদ দেওয়া হয়েছে। স্থগিত করার চেষ্টা করুন sleep 5 || echo hello, এবং টিপানোর helloপরে সরাসরি দেখায় ^Z
এইচডিভি

1
@ এইচডিডি: হ্যাঁ, আপনি ঠিক বলেছেন, এবং আমি আবার ভুল করছি> <<, bash4 ব্যবহার করে। স্পষ্টতই অনেক দিন হয়ে গেছে যখন আমি সিদ্ধান্ত নিয়েছিলাম যে & অ্যালার্ম অনুস্মারকের at(1)মতো জিনিসগুলির sleep 30m && mplayer something.mp3জন্য বা sleep 90m && fgপরে একটি ডিস্ক-নিবিড় কমান্ড পুনরায় চালু করার জন্য ঘেঁটো হিসাবে যাওয়ার উপায় । সুতরাং প্রকৃতপক্ষে, দুর্দান্ত sleep 5m && echo helloকারণ কারণ নিম্নলিখিত আদেশটি মোটেও চালনা না করে ^Zস্থগিত করে sleep। যদি আপনি ঘুমের বাইরে বেরোনোর ​​আগেই পুরো কমপઉન્ડ কমান্ডটি স্থগিত / পুনরায় চালু করতে সক্ষম হতে চান তবে ব্যবহার করুন ( sleep 2 && echo hello )
পিটার কর্ডেস

@ এইচভিডি: &&আইডিয়ামটি আপনাকে নিখুঁতভাবে নিশ্চিত করতে দেয় যে আপনি ঘুমানোর পরে ঠিক প্রক্রিয়াটি মারবেন না (কারণ আপনি ^Zঝুঁকি না দিয়ে কমান্ডটি চালাতে পারবেন না ^C)। এই দরকারী sleep && fgবা sleep && bgব্যবহার-মামলা, যখন কমান্ড হচ্ছে পুনরায় শুরু ধীর কিছু মাধ্যমে অংশ উপায়।
পিটার কর্ডেস

5

আপনি এই স্ক্রিপ্টটি ব্যবহার করতে পারেন:

#!/bin/bash

TEMPFILE="$(mktemp)"
STARTTIME="$(date +%s)"
(./longprocess; rm -f "$TEMPFILE") &
while [ -f "$TEMPFILE" ]; do
    sleep 1s
    NOW="$(date +%s)"
    if (( (NOW-STARTTIME) % 300 == 0 )); then
        echo "$(( (NOW-STARTTIME)/60 )) minute(s) elapsed"
    fi
done
echo "Done!!!"

এটা আপনার executes longprocessএকটি sub-shellঅস্তিত্বের এবং তারপর মনিটর পূর্বে তৈরি 'lock' পাঠানো ফাইল।


2
man bashজন্য পরীক্ষা করুন SECONDS। আপনি SECONDS=0স্ক্রিপ্ট শুরুতে সেট করতে পারেন এবং কেবল বৃহত্তর বা সমান 300 এর জন্য পরীক্ষা করতে পারেন বা সেট করতে পারেন এবং আপনার স্ক্রিপ্টে আবার SECONDS=$((date +%s))ব্যবহার dateকরতে ভুলবেন না ...

@ ইয়েতি, ইঙ্গিতটির জন্য ধন্যবাদ, আমি এটি জানতাম না।
সার্জ

@ ইয়েতি, আপনি যদি আগের সময়ের sleep 1sচেয়ে সর্বদা এক সেকেন্ড পরে সময়টির উপর নির্ভর করতে চান sleep 1s... তবে আপনি প্রোগ্রামাররা সময় সম্পর্কে বিশ্বাস করে এমন মিথ্যাবাদীর শিকার হয়ে পড়েছেন । (যদিও এই ক্ষেত্রে, আপনি কেবল একটি হ্যাশ চিহ্নের অগ্রগতি বার বা কিছু দেখিয়ে দিতে পারেন))
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড ... আমি মোটেই উল্লেখ করিনি sleep!

@ ইয়েতি, ঠিক আছে তুমি। সম্পর্কে টিপ জন্য ধন্যবাদ SECONDS! :)
ওয়াইল্ডকার্ড

4

এর জন্য একটি লাইন রয়েছে:

( ( sleep $TIMEOUT ; echo "5 minutes complete") & $COMMAND )

আপনার ক্ষেত্রে TIMEOUT = 5m এবং COMMAND দীর্ঘ কমান্ড।

'সার্ভিস নেটওয়ার্ক পুনঃসূচনা' এর সাথে এই পোস্টটির আমার উত্তরও দেখুন


অগ্রভাগে সাবশেল চালু করা এবং কমান্ডটি কার্যকর করা অযথা জটিল বলে মনে হচ্ছে। আমি বাইরের বন্ধনী এবং এক্সিকিউট সরিয়ে ফেলব।
গ্লেন জ্যাকম্যান

1
@glennjackman এইভাবে কেউ সিটিআরএল + সি (উদাহরণস্বরূপ) মূল (বহির্মুখী) সাব-শেলটিতে পাঠানো পুরো প্রক্রিয়াটিকে হত্যা করতে পারে।
coffeMug

1
তবে এক্সিকিউট ব্যবহার করে আপনার আর সাব-শেল নেই, আপনার কাছে কেবল কমান্ড রয়েছে। কমান্ডের প্যারেন্টটি হ'ল স্ক্রিপ্টটি চালিত শেল যেমন আপনি কোনও সাব-শেল ব্যবহার করেন নি।
গ্লেন জ্যাকম্যান

3
#! /bin/bash

( sleep 4 ) & # <-- The long running process.

seconds=1
while jobs %1 &>/dev/null ; do
    echo $((seconds++)) seconds complete
    sleep 1    
done
echo Done.

jobs %1 চাকরি% 1 বন্ধ হয়ে গেলে একবার ব্যর্থ হয়।

নোট করুন যে দীর্ঘ সময়ের জন্য, $ সেকেন্ডগুলি রিয়েল টাইমের সাথে সিঙ্ক থেকে বেরিয়ে যেতে পারে। প্রারম্ভের সময়টি সঞ্চয় করা এবং প্রকৃত সময়ের সাথে পার্থক্যটি গণনা করা ভাল।

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