শেল: `ঘুম without ব্যবহার না করে কি কোনও কমান্ড বিলম্ব করা সম্ভব?


21

ব্যবহার না করে বিলম্ব কমান্ডের জন্য কোনও বিকল্প, বিকল্প বা বাশ কৌশল আছে sleep? উদাহরণস্বরূপ, ঘুম ব্যবহার না করে নীচের কমান্ডটি সম্পাদন করা:

$ sleep 10 && echo "This is a test"

42
এর সাথে কী হয়েছে sleep?
মুড়ু

5
কৌতূহল ব্যতীত অন্য কোন আসল কারণ নেই। আমি ভেবেছিলাম কিছু বিকল্প সমাধান শিখতে আকর্ষণীয় হবে। আমি মনে করি atএটি এক হতে পারে তবে আমি কোনও ব্যবহারের উদাহরণ পাই না।
ব্যবহারকারী321697

1
@ ব্যবহারকারী321697 "এট" একক কাজের শিডিয়ুল করা। এডিড পরিষেবা দ্বারা এগুলি কার্যকর করা হয়, সুতরাং তারা আপনার শেল স্ক্রিপ্টটি থামিয়ে দেবে না। এগুলির জন্য একটি ব্যবহারের ক্ষেত্রে এটি নির্দিষ্ট সময় (অ্যাসিঙ্ক) কিছু করতে হবে এবং এটি শেষ হয়ে গেলে একটি মার্কার ফাইল তৈরি করতে হবে, যখন আপনার স্ক্রিপ্টটি কিছুক্ষণ লুপে উপস্থিত হওয়ার অপেক্ষায় রয়েছে। আপনি নিজের স্ক্রিপ্টকে একটি সাইনকন্ট প্রেরণ করার জন্য কোনও কাজের সময় নির্ধারণ করে এবং তারপরে নিজেকে একটি সাইনস্টপ প্রেরণ করে আপনার স্ক্রিপ্টটি হিমাংশ করে একইরকম প্রভাব অর্জন করতে পারেন।
গ্রেগা ব্রিমেক

1
আমি সবাই স্পিনলকের পরামর্শ দেওয়ার প্রত্যাশা করে এখানে এসেছি। আমি আনন্দিতভাবে সমস্ত উত্তর দ্বারা অবাক।
দান ভ্যান হোইক

3
পুনরায়: "কৌতূহল" - এ unix.stackexchange.com/help/dont-ask , প্রয়োজন লক্ষ্য করুন যে "আপনি কেবল ব্যবহারিক, জবাবদিহি প্রশ্ন জিজ্ঞেস করা উচিত প্রকৃত সমস্যা আপনি সম্মুখীন উপর ভিত্তি করে। " - যে এই সু- হয়েছে গাইডলাইনটি এটি একটি বিরল ব্যতিক্রম করে তোলে তা স্বাক্ষরিত করেও প্রাপ্তি।
চার্লস ডাফি

উত্তর:


17

আপনার বিকল্প রয়েছে sleep: সেগুলি atএবং cronsleepএগুলির বিপরীতে আপনাকে যে সময় চালানোর প্রয়োজন হয় তা সরবরাহ করা প্রয়োজন।

  • atdনির্বাহ করে পরিষেবাটি চলমান রয়েছে তা নিশ্চিত করুন service atd status
    এখন ধরা যাক তারিখটি 11:17 am ইউটিসি; যদি আপনি 11:25 ইউটিসি কমান্ড নির্বাহ করতে হবে, সিনট্যাক্স হল: echo "This is a test" | at 11:25
    এখন মনে রাখবেন যে atdডিফল্টরূপে কাজ সমাপ্তি লগ করা হবে না। আরও তথ্যের জন্য এই লিঙ্কটি উল্লেখ করুন । আপনার অ্যাপ্লিকেশনটির নিজস্ব লগিং রয়েছে এটি ভাল।

  • আরও তথ্যের জন্য আপনি এখানে কাজের সময় নির্ধারণ করতে পারেন cron: man cronএর বিকল্পগুলি দেখতে বা crontab -eনতুন চাকরি যুক্ত করতে। /var/log/cronকাজের উপর কার্যকরকরণ সম্পর্কিত তথ্যের জন্য চেক করা যায়।

এফওয়াইআই sleep system call বর্তমান সম্পাদন স্থগিত করে এবং তত্ক্ষণিকভাবে এটির পক্ষে যুক্তিতর্কটি নির্ধারণ করে।

সম্পাদনা করুন:

@ গাইউস যেমন উল্লেখ করেছেন, আপনি কমান্ডের জন্য কয়েক মিনিট সময়ও যোগ করতে পারেন ut তবে সময় atবলতে সময় দেয় 12:30:30এবং এখন আপনি শিডিয়ুলারটি চালিয়ে যান now +1 minutes। যদিও 1 মিনিট, যা 60 সেকেন্ডে অনুবাদ করা হয়েছে তা নির্দিষ্ট করা হয়েছিল, কাজটি কার্যকর করার জন্য atঅপেক্ষা করে না 12:31:30, বরং এটি কাজটি সম্পাদন করে 12:31:00। সময় ইউনিট হতে পারে minutes, hours, days, or weeks। আরও পড়ুনman at

উদাহরণ: echo "ls" | at now +1 minutes


7
এটি সত্য নয়, আপনি এখন +1 মিনিট বলার জন্য এক মিনিটের মধ্যে দৌড়ানোর জন্য কাজের সময় নির্ধারণ করতে পারেন
গাইস

29

দিয়ে bashbuiltins, আপনি করতে পারেন:

coproc read -t 10 && wait "$!" || true

ব্যবহার না করে 10 সেকেন্ডের জন্য ঘুমাতে sleepcoprocযাতে করা হয় readএর stdin একটি নল যেখানে কিছুই কি কখনো থেকে বের হবে। || trueকারণ waitপ্রস্থান স্থিতি একটি সিগালআরএম বিতরণ প্রতিফলিত করবে যা errexitবিকল্পটি সেট করা থাকলে শেলটি প্রস্থান করতে পারে ।

অন্যান্য শেলগুলিতে:

mkshএবং ksh93আছে sleepবিল্ট-ইন, অন্য কিছু ব্যবহার (যদিও তারা উভয় এছাড়াও সমর্থন করে কোনো লাভ read -t)।

zshএছাড়াও সমর্থন করে read -t, তবে চারদিকে বিল্টিন র‍্যাপারও রয়েছে select(), যাতে আপনি এটি ব্যবহার করতে পারেন:

zmodload zsh/zselect
zselect -t 1000 # centiseconds

আপনি যদি চান তা যদি ইন্টারেক্টিভ শেল সেশন থেকে শিডিয়ুল জিনিস চালানো হয় তবে zsh/schedমডিউলটিওzsh দেখুন ।


আপনি বিবেচনা করবেন read -t 10 < /dev/zero || true?
জেফ শ্যাচলার

5
@ জেফ শ্যাচলার এই ব্যস্ত লুপ হিসাবে আমি এড়াতে চাই।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস আমি আশা করি না যে এটি একটি ব্যস্ত লুপ হবে - আমি আশা করি যে কোনও শেল readসিলেক্ট (2) বা অনুরূপ কিছু ব্যবহার করে প্রয়োগ করা হবে (যা বোঝায় টাইম আউট এই প্রশ্নের উত্তম উত্তর হবে)। আমি আপনার বিরোধিতা না করে অবাক করে দিচ্ছি, তবে আপনি কি আরও আলোচনা করতে পারেন?
নরম্যান গ্রে

5
@ নরম্যানগ্রে, /dev/zeroএমন একটি ফাইল যা অসীম পরিমাণে ডেটা (NUL বাইট) ধারণ করে। সুতরাং read10 সেকেন্ডের সময় এটি যতটা সম্ভব পড়বে। ধন্যবাদ, bashযার ক্ষেত্রে NUL বাইটগুলি তার ভেরিয়েবলগুলিতে সঞ্চয় করতে সমর্থন করে না, এটি কোনও স্মৃতি ব্যবহার করবে না, তবে এটি এখনও সিপিইউ সংস্থানগুলিকে হোগ করবে।
স্টাফেন চেজেলাস

1
@ নরম্যানগ্রে, যদি টার্মিনাল থেকে চালিত হয় তবে এটি টিটিআই /dev/stdoutডিভাইস হবে, সুতরাং এর পার্শ্ব প্রতিক্রিয়া হবে (যেমন পটভূমিতে চালানো থাকলে স্ক্রিপ্টটি থামানো) এবং যদি ব্যবহারকারী চাপুন উদাহরণস্বরূপ প্রবেশ করে তবে ফিরে আসবে। read -t 10 /dev/stdout | :লিনাক্সে কাজ করবে তবে কেবল লিনাক্সে, coprocওএস নির্বিশেষে কাজ করা উচিত।
স্টাফেন চেজেলাস

7

অন্য কিছু ধারণা।

top -d10 -n2 >/dev/null

vmstat 10 2 >/dev/null

sar 10 1 >/dev/null

timeout 10s tail -f /dev/null

1
টাইমলিট / টাইমআউট সম্পর্কে আমার ধারণা আপনি "চুরি" করেছেন .... +1
রুই এফ রিবেইরো

1
ওহহহ, আমার, ধন্যবাদ, আমি ঘুম ছাড়া এমন পরিস্থিতিতে ছিলাম, শীর্ষটি আশ্চর্যজনক!
ফায়ার-ড্রাগন-ডোল

6

যেহেতু এমন উত্তর রয়েছে যাগুলির অ-মানক -t delayবিকল্পটি ব্যবহার করার পরামর্শ দিচ্ছে read, তাই এখানে একটি স্ট্যান্ডার্ড শেলটিতে সময়সাপেক্ষে করার উপায় রয়েছে:

{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }

যুক্তিটি stty timeসেকেন্ডের দশমীতে।


5

ব্যাশ অন্তর্নির্মিত চলক $SECONDSএবং একটি ব্যস্ত লুপ ব্যবহার করে:

for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done

2
এটি কার্যত 9 থেকে 10 সেকেন্ডের মধ্যে কোথাও স্থিতির জন্য বিরতি দেবে যদিও ( কোনও বাগেরbash কারণে ; zshএবং mkshএকই রকম সমস্যা থাকলেও পরে ঠিক করা হয়েছে)
স্টাফেন চ্যাজেলাস

7
তাপ তৈরির একটি ভাল উপায়।
ctrl-alt-delor

6
আমি গরম বাতাসে পূর্ণ হওয়ার অভিযোগ এনেছি না! :)
জেফ শ্যাচলার

4

বইয়ের প্রাচীনতম কৌশল:

read && echo "This is a test"

শুধু আঘাত Enterএবং এটি অবিরত থাকবে!


প্রক্রিয়াটি মুক্ত বা ব্যাকগ্রাউন্ডে মিথস্ক্রিয়া চালানোর দরকার হয় কিনা?
ss_iwe

সঠিক: তবে এটি মূল প্রশ্ন অনুসারে
ওপি'র

1
ওপি বিশেষত একটি উদাহরণ দেয় (সাথে sleep) এবং ছাড়াই সমমানের বিকল্পের জন্য জিজ্ঞাসা করে। সুতরাং readবিশ্লেষণ করবেন না, দুঃখিত। ;)
AnoE

@ কোনও স্টাফেনের উত্তর অবশ্যই সেরা, আমার খালি সবচেয়ে প্রাচীন --- press «enter» to continue --- ;-)
ফ্যাবি

4

বেসিক চলমান মাইক্রো কম্পিউটারের দিনগুলিতে, দেরি সাধারণত একটি খালি লুপ দিয়ে সম্পন্ন করা হত:

FOR I = 1 TO 10000:NEXT

শেল স্ক্রিপ্টে বিলম্ব সন্নিবেশ করতে একই নীতিটি ব্যবহার করা যেতে পারে:

COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done

অবশ্যই, এই পদ্ধতির সমস্যাটি হ'ল বিলম্বের দৈর্ঘ্য তার প্রসেসরের গতি অনুসারে মেশিন থেকে মেশিনে পরিবর্তিত হবে (বা এমনকি বিভিন্ন লোডের অধীনে একই মেশিনে)। বিপরীতে sleep, এটি সম্ভবত আপনার সিপিইউ (বা এর কোনও একটির) সর্বাধিক আউটও করবে।


2
তাপ তৈরির একটি ভাল উপায়।
ctrl-alt-delor

2
ইউনিক্স-এর মতো ওএস চালাতে পারে এমন কোনও আধুনিক সিপিইউতে খুব সংক্ষিপ্ত ঘুম (কোনও ডিভাইস ড্রাইভারের মধ্যে একটি দম্পতি ন্যানোসেকেন্ড বা ক্লক চক্র) ব্যতীত অন্য কোনও কিছুর জন্য বিলম্ব-লুপগুলি ভয়ঙ্কর ধারণা। অর্থাত্ এত ছোট একটি ঘুম আপনি কার্যকরভাবে সিপিইউ অপেক্ষা করার সময় অন্য কিছু করতে পারবেন না, যেমন অন্য কোনও প্রক্রিয়া নির্ধারিত করে বা টাইমার বিঘ্নে জেগে ওঠার আগে একটি স্বল্প-শক্তি ঘুমের রাজ্যে প্রবেশ করুন। গতিশীল সিপিইউ-ফ্রিকোয়েন্সি এমনকি র‌্যাম্পিংয়ের আগে কম ঘড়ির গতিতে বেশিরভাগ বেশি ঘুমানো সম্ভাব্য ন্যূনতম বিলম্ব ব্যতীত প্রতি সেকেন্ডের জন্য একটি বিলম্ব লুপটি ক্যালিব্রেট করাও অসম্ভব করে তোলে।
পিটার কর্ডেস

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

সিপিইউ ইতিহাস সম্পর্কে আরও তথ্যের জন্য, আধুনিক মাইক্রোপ্রসেসরগুলি একটি 90-মিনিটের গাইড দেখুন! - লাইট্রা / পেপারস / আধুনিক জৈব প্রসেসরগুলি
পিটার কর্ডেস

3

কোনও অন্তর্নির্মিত নেই, এটি একই রকম করে sleep(যতক্ষণ না sleepঅন্তর্নির্মিত না হয়)। তবে আরও কিছু কমান্ড রয়েছে যা অপেক্ষা করবে।

কয়েকটি অন্তর্ভুক্ত।

  • atএবং cron: একটি নির্দিষ্ট সময়ে কার্য শিডিউল করতে ব্যবহৃত।

  • inotifywait: কোনও ফাইলের জন্য অপেক্ষা করতে বা ফাইলগুলি সংশোধন / অপসারণ / যুক্ত / ইত্যাদি ব্যবহার করতে ব্যবহৃত হয়


এর জন্য ধন্যবাদ. আপনি একটি নির্ধারিত টাস্ক (এখন থেকে 10 সেকেন্ড) সম্পাদনের জন্য একটি উদাহরণ সরবরাহ করতে পারেন at?
ব্যবহারকারী321697

1
একটি সম্পাদনা এবং একটি upvote! ;-)
ফেব্বী

cronস্টোর টাস্ক গুলো crontabঠিক আছে? কোথায় atনির্ধারিত ডেটা সঞ্চয় করে?
ব্যবহারকারী321697

@ ব্যবহারকারী321697 ইতিমধ্যে এখানে
ফাব্বি

আপনার সম্পাদনাটিকে প্রশ্নে ফিরিয়ে দেওয়ার জন্য দুঃখিত: আপনি ওপিএস প্রশ্নের মূল উদ্দেশ্য পরিবর্তন করেছেন যা সকলের সহজ উত্তরটি অবৈধ করে দেবে ... ¯ \ _ (ツ) _ / ¯
ফ্যাবি

3

উইন্ডোজ এবং ব্যাচস ল্যান্ড থেকে একটি ক্লাসিক:

ping -c 11 localhost >/dev/null && echo "This is a test"

ফায়ারওয়াল বা নাম সিস্টেমের ভুল কনফিগারেশনটি উল্লেখযোগ্য অতিরিক্ত বিলম্বকে শক্ত করে পরিচয় করিয়ে দিতে পারে।
স্পেকট্রা

1
127.0.0.1 ... @ স্পেকট্রা
আনো

1
ধন্যবাদ উইন্ডোজ এখন দেশীয়ভাবে ঘুম সমর্থন হিসাবে, আর প্রয়োজন নেই।
বাল্ড্রিক 18

1
@ কোন> ফায়ারওয়াল অংশ নয়, নাম সিস্টেম অংশটি সমাধান করে। সাধারণ না হলেও এটি স্থানীয় ইন্টারফেসে নিঃশব্দে পিংস ফেলে দেওয়ার জন্য কনফিগার করা যেতে পারে। এটি পিংকে আরও বেশি সময় অপেক্ষা করবে।
spectras

"অনুরাগী" স্মৃতিগুলির জন্য +1
এসি

0

আপনি যদি ইন্টারেক্টিভভাবে কোনও ফাইলের একটি নতুন লাইনের জন্য অপেক্ষা করতে চান, তবে

tail -f

একটি ফাইল সিস্টেমে পরিবর্তনের জন্য অপেক্ষা করছেন? তারপর যেমন ব্যবহার করুন

inotify / inoticoming

এবং "অপেক্ষার" সাথে আপনি কী বোঝাতে চান তার উপর নির্ভর করে অন্যান্য বিকল্প রয়েছে।

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