আমি বাশ বা কেএসএসে মিলিসেকেন্ডের জন্য কীভাবে ঘুমাব


128

ঘুম একটি খুব জনপ্রিয় আদেশ এবং আমরা 1 সেকেন্ড থেকে ঘুম শুরু করতে পারি:

# wait one second please 
sleep 1

তবে আমার যদি মাত্র 0.1 সেকেন্ড বা 0.1 থেকে 1 সেকেন্ডের মধ্যে অপেক্ষা করতে হয় তবে বিকল্পটি কী?

  • মন্তব্য: লিনাক্স বা ওএস এক্সে sleep 0.XXXসূক্ষ্মভাবে কাজ করে তবে সোলারিস sleep 0.1বা sleep 0.01- অবৈধ বাক্য গঠনতে

2
আমি জিজ্ঞাসা করতে পারি আপনি কেন 1 মিমি ঘুমাতে চান?
টম ও'কনোর

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

3
আপনি যে কোনও সমাধান চয়ন করুন না কেন, মনে রাখবেন যে শেল স্ক্রিপ্ট সময়সীকরণের ক্ষেত্রে খুব সঠিক হবে না।
স্কাই

কীভাবে এমন কিছু করা যায় যা কার্যকর করতে খুব অল্প সময় নেয়, কিন্তু কিছুই করে না .. যেমনecho "" >/dev/null
টম ও'কনর

ভাল ধারণা তবে এই কমান্ডটি কীভাবে এমসিকে গ্রহণ করবে? , আমার দরকার 0.1 ম্যাসি, এর চেয়ে কম নয় - :)
ইয়েল

উত্তর:


68

বাশের একটি "লোডযোগ্য" ঘুম রয়েছে যা ভগ্নাংশের সেকেন্ডগুলিকে সমর্থন করে এবং একটি বাহ্যিক কমান্ডের ওভারহেডগুলি সরিয়ে দেয়:

$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep

তারপর:

$ which sleep
/usr/bin/sleep
$ builtin sleep
sleep: usage: sleep seconds[.fraction]
$ time (for f in `seq 1 10`; do builtin sleep 0.1; done)
real    0m1.000s
user    0m0.004s
sys     0m0.004s

খারাপ দিকটি হ'ল লোডেবলগুলি আপনার bashবাইনারি সরবরাহ করা যায় না , সুতরাং আপনাকে সেগুলি প্রদর্শিত হিসাবে সেগুলি নিজেই সংকলন করতে হবে (যদিও সোলারিসে এটি উপরের মতো সহজ হবে না)।

এর হিসাবেbash-4.4 (সেপ্টেম্বর 2016) সমস্ত loadables এখন আগে থেকেই রয়েছে ও প্ল্যাটফর্মে যা এটিকে সমর্থন করে, যদিও তারা পৃথক ভাগ-বস্তুর ফাইল হিসেবে আগে থেকেই রয়েছে ডিফল্টরূপে ইনস্টল, এবং একটি ছাড়া .soপ্রত্যয়। যদি না আপনার ডিস্ট্রো / ওএস সৃজনশীল কিছু করে থাকে তবে আপনার পরিবর্তে এটি করতে সক্ষম হওয়া উচিত:

[ -z "$BASH_LOADABLES_PATH" ] &&
  BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)  
enable -f sleep sleep

(ম্যান পেজটি ইঙ্গিত করে BASH_LOADABLES_PATHযে এটি স্বয়ংক্রিয়ভাবে সেট হয়ে গেছে, আমি দেখতে পেয়েছি যে ৪.৪.১২ হিসাবে সরকারী বিতরণে এটি ঘটেনি If যদি এবং এটি সঠিকভাবে সেট করা হয় তবে আপনার প্রয়োজন অনুযায়ী কেবল enable -f filename commandnameপ্রয়োজন))

যদি এটি উপযুক্ত না হয় তবে পরবর্তী সহজ কাজটি হ'ল sleepজিএনইউ কোর্টিলগুলি তৈরি করা বা নেওয়া, এটি প্রয়োজনীয় বৈশিষ্ট্যটিকে সমর্থন করে। POSIX sleepকমান্ডটি ন্যূনতম, পুরানো সোলারিস সংস্করণ কেবল এটি প্রয়োগ করেছে implemented সোলারিস 11sleep ভগ্নাংশ সেকেন্ড সমর্থন করে

একটি শেষ অবলম্বন হিসাবে আপনি perl(বা অন্য যে কোনও স্ক্রিপ্টিং যা আপনাকে হস্তান্তরিত করতে হবে) সেই ক্যাভেটের সাথে ব্যবহার করতে পারেন যে দোভাষীকে আরম্ভ করার উদ্দেশ্যটি ঘুমের সময়ের সাথে তুলনীয় হতে পারে:

$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh

2
আহ, যেহেতু আপনি ব্যবহার করছেন expectআপনি সম্ভবত " after N" ব্যবহার করতে পারেন , যেখানে এন হ'ল মিলি সেকেন্ড, সরাসরি আপনার স্ক্রিপ্টে।
মিঃ স্পুর্যাটিক

ব্যবহার usleep@Luis Vazquez এবং @sebix লেখার মত
Ilan.K

অ্যাপল ম্যাকস-এর বিএসডি স্লিপ রয়েছে, যা ভগ্নাংশের সেকেন্ডগুলিকেও সমর্থন করে
রোব্লগিক ২

125

কোর্টিলsleep থেকে কমান্ডের ডকুমেন্টেশন বলে:

ঘুমের implementতিহাসিক বাস্তবায়নের জন্য সেই সংখ্যাটি পূর্ণসংখ্যার হতে হবে এবং প্রত্যয় ছাড়াই কেবল একটি যুক্তিই গ্রহণ করেছে। তবে, জিএনইউ স্লিপ নির্বিচারে ভাসমান পয়েন্ট সংখ্যাগুলি গ্রহণ করে। ভাসমান পয়েন্ট দেখুন ।

অত: পর আপনি ব্যবহার করতে পারেন sleep 0.1, sleep 1.0e-1এবং অনুরূপ আর্গুমেন্ট।


1
সোলারিস ওএস সম্পর্কে আমার মন্তব্য দেখুন
yael

আপনি তালগোল কি হয় এবং না করা হয় ?
স্কাই

আমার quastion আমার আপডেট দেখতে
Yael

1
ইয়ায়েল, আমি মনে করি আপনার প্রশ্নে এখনও অনেকগুলি নেতিবাচক রয়েছে; আপনি কি নিশ্চিত যে "বেআইনী সিনট্যাক্স নন"?
ম্যাডহ্যাটার

উদাহরণস্বরূপ - আমি সোলারিস 10 এ চলেছি: # ঘুম 0.1 ঘুম: যুক্তি হিসাবে খারাপ চরিত্র, লিনাক্স ঘুম সম্পর্কে 0.1 ভাল কাজ করে
yael

58

ঘুম দশমিক সংখ্যা গ্রহণ করে যাতে আপনি এটিকে এই জাতীয়ভাবে ভেঙে ফেলতে পারেন:

এক সেকেন্ডের 1/2

 sleep 0.5

এক সেকেন্ডের 1/100

sleep 0.01

এক মিলিসেকেন্ডের জন্য আপনি চান

sleep 0.001

4
দশমিক পয়েন্টের আগে আপনি নেতৃস্থানীয় শূন্যকেও ফেলে দিতে পারেন। যেমন। sleep .5
মাইক কাউজার


একে অপরকে জটিল করে তোলার বিষয়ে কথা বলুন ...
মার্টিন

1
@ মাইককোজার নেতৃস্থানীয় শূন্যগুলি পরে আরও বেশি পাঠযোগ্য এবং সংকেতটি কোডের পাঠকের উদ্দেশ্যে দেয়। আপনি যখন গণিত করেন তখন আরও ভাল।
আলেকজান্ডার মিলস


8

আপনি কেবল ব্যবহার করতে পারেন usleep। এটি প্যারামিটার হিসাবে মাইক্রোসেকেন্ডগুলি (= 1e-6 সেকেন্ড) লাগে, সুতরাং 1 মিলিসেকেন্ড ঘুমাতে আপনি প্রবেশ করতে পারেন:

usleep 1000

1
$ usleep No command 'usleep' found, did you mean: Command 'sleep' from package 'coreutils' (main) usleep: command not found
বুলেটম্যাগনেট

না, আমি প্যাকেজের usleepঅংশটি বলতে চাই initscriptsযা কমপক্ষে সমস্ত রেড হ্যাট থেকে প্রাপ্ত ডিস্ট্রিবিউশনে মানসম্পন্ন; কমপক্ষে আরএইচইএল, সেন্টস, ফেডোরা, ম্যাগিয়া / মান্দ্রিভা এবং সুএসই সহ। এখানে একটি উদাহরণ: `` ``
লুইস ওয়াজকেজ

1
এখানে সেন্টোস in: `` `in এ চলছে এমন একটি নমুনা ইলাস্ট্রেশন যা ইউএসপি / ইউএসআর / বিন / ইউস্লিপ $ আরপিএম -কিএফ / ইউএসআর / বিন / ইউএসপ ইনসাইটস-স্ক্রিপ্টস -9.49.37-1.el7_3.1.x86_64` `sum সংক্ষেপে : - sleep( কোর্টিলস থেকে ) সেকেন্ডের সাথে কাজ করে - usleep( ইনসক্রিপ্ট থেকে ) মাইক্রো সেকেন্ডের সাথে কাজ করে
লুইস ওয়াজকেজ

4

আমার একই সমস্যা ছিল (সোলারিসের উপর কোনও শেল নেই) তাই আমি আমার নিজের লিখেছিলাম:

  #include "stdio.h"
  int main(int argc, char **argv) {
     if(argc == 2) { usleep(atoi(argv[1])); }
     return 0;
}

যুক্তিগুলি যাচাই করে না - আপনি যদি এটি রাখতে চান তবে আমি সঠিকভাবে লিখিত একটি সুপারিশ করব তবে এটি (জিসিসি ইউএসপ্রেল.কম - ইউএসপ) আপনাকে কোনও গর্ত থেকে নামিয়ে দেবে।


1
আপনি পারে অন্তত পরিবর্তন বেয়ার যে usleep()কলে if(argc == 1) { usleep(atoi(argv[1])); }অ্যারের সীমার, যা অপ্রত্যাশিত আচরণে যে কোন সংখ্যার হতে পারে বাইরে ইন্ডেক্স এড়ানো।
একটি সিভিএন

@aCVn এটি আসলে if (argc == 2) { usleep(atoi(argv[1])); }...
রিং Ø

এছাড়াও লক্ষ করুন যে usleepইউনিটটি μs, সুতরাং 1 সেকেন্ড অপেক্ষা করার জন্য, আপনাকে একটি 1000000 যুক্তি সরবরাহ করতে হবে।
রিং Ø

@ রিং Ø ঠিক আছে। বোকা ভুল, ভাল ধরা।
একটি সিভিএন

atoi()একটি স্ট্রিংকে একটিতে রূপান্তরিত করা একটি ভয়ঙ্কর পছন্দ int। কি atoi( "STRING" )ফিরে আসে? atoi()কোনও ত্রুটি ফিরে পাওয়ার কোনও উপায় নেই।
অ্যান্ড্রু হেনেল

0

আমি ঘুমের ধারণাটি পছন্দ করি তবে আমি এর নিচে কোনও মন্তব্য করতে পারি না। যেহেতু এটি আমাকে সাহায্য করেছে, আমি আশা করি আমার পরামর্শটি ঘুমের ধারণা উন্নত করতে পারে।

https://github.com/fedora-sysv/initscriptts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c হল redhat বাস্তুসংস্থার usleep.c এর আসল উত্স কোড।

আপনার সোলারিসে এটি সংকলন করার চেষ্টা করুন। আপনার সম্ভবত https://www.opencsw.org/packages/libpopt0/ প্রয়োজন ।

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