টার্মিনালে প্রতিটি x ব্যবধানে একটি কমান্ড পুনরাবৃত্তি করবেন?


141

আমি প্রতিবার অন্তর অন্তর কোনও আদেশকে কীভাবে পুনরুক্ত করতে পারি , যাতে এটি আমাকে ডিরেক্টরিগুলি পরীক্ষা করার বা পর্যবেক্ষণের জন্য কমান্ড চালানোর অনুমতি দেয় ?

স্ক্রিপ্টের দরকার নেই, টার্মিনালে চালিত হওয়ার জন্য আমার কেবল একটি সাধারণ কমান্ডের প্রয়োজন।

উত্তর:


219

আপনি watchকমান্ডটি ব্যবহার করতে পারেন , নিয়মিত বিরতিতে কোনও নির্ধারিত কমান্ড চালাতে ঘড়ি ব্যবহার করা হয়।

টার্মিনাল খুলুন এবং টাইপ করুন:

watch -n x <your command>

আপনি চান সেকেন্ডের সময় হতে এক্স পরিবর্তন করুন ।

watchকমান্ড এবং এর বিকল্পগুলি ব্যবহারে আরও সহায়তার man watchজন্য, এই লিঙ্কটি চালান বা দেখুন ।

উদাহরণস্বরূপ: নিম্নলিখিত Ter০ এর দশকে একই টার্মিনালে ডেস্কটপ ডিরেক্টরিটির বিষয়বস্তু তালিকাভুক্ত করা হবে যাতে আপনি জানতে পারবেন যে কোনও পরিবর্তন হয়েছে কিনা:

watch -n 60 ls -l ~/Desktop

34
+1 তবে বিস্তৃতি ব্যবহার করার সময় সতর্ক থাকুন। উদাহরণস্বরূপ, আপনার টার্মিনালের আকার পরিবর্তন করার সময় watch -n 1 'echo $COLUMNS'এবং এর মধ্যে পার্থক্যটি চেষ্টা করুন watch -n 1 echo $COLUMNS- প্রাক্তনটি প্রতি সেকেন্ডে প্রসারিত হয়, তবে দ্বিতীয়টি শুরু হওয়ার আগে একবার প্রসারিত হয় watch
l0b0

এটি যাদুমন্ত্রের মত কাজ করে ! Ty nux

এই সমাধানটির সাথে আমার সমস্যাটি হ'ল আপনি একটি প্রক্রিয়া হিসাবে ঘড়িটি চালাতে পারবেন না এবং এটি কেবল পটভূমিতে চলতে দিন (উদাহরণস্বরূপ এবং অস্বীকার করুন)
সিস্ট্রিয়ান

2
watch"ইতিহাস সক্ষম" টাইপ কমান্ড দিয়ে ব্যবহার করার কোনও উপায় আছে কি ? আমি ব্যবহার watchকরতে পছন্দ করি তবে কখনও কখনও আমি শেষের মৃত্যুদণ্ডের পরিবর্তে পূর্বের মৃত্যুদণ্ড কার্যকর করতে চাই see এবং হ্যাঁ, আমি জানি আমি এটি while trueসম্পাদন করতে স্ক্রিপ্টিং ( ) ব্যবহার করতে watchপারি , তবে ইউটিটিটি ব্যবহার করা এত পরিষ্কার!
রিনোগো

এটি সরল কমান্ডের জন্য কাজ করেছে তবে পাইপলাইনযুক্ত কমান্ডগুলির শৃঙ্খলা দিয়ে এটি আমার পক্ষে কার্যকর হয়নি .. নিম্নলিখিত আদেশটি আমি চেষ্টা করেছি => বিড়াল api.log | গ্রেপ 'কলিং' | wc -l
সুদীপ ভান্ডারী

89

আপনি এই কমান্ডটি টার্মিনালে ব্যবহার করতে পারেন, nux এর উত্তর ছাড়াও:

while true; do <your_command>; sleep <interval_in_seconds>; done

উদাহরণ

while true; do ls; sleep 2; done

এই কমান্ডটি ls2 সেকেন্ডের ব্যবধানে আউটপুট প্রিন্ট করবে ।

প্রক্রিয়া বন্ধ করতে Ctrl+ ব্যবহার করুন C

এর কিছু কমতি রয়েছে watch

  • এটি কোনও এলিয়াসেড কমান্ড ব্যবহার করতে পারে না।
  • যদি কোনও কমান্ডের আউটপুট বেশ দীর্ঘ হয় তবে স্ক্রোলিং সঠিকভাবে কাজ করে না।
  • নির্দিষ্ট মানের বাইরে সর্বাধিক সময়ের ব্যবধান সেট করতে কিছু সমস্যা আছে ।
  • watchএএনএসআই রঙ সিকোয়েন্সগুলি -cবা --colorবিকল্প ব্যবহার করে পালিয়ে যাওয়া অক্ষরগুলিকে ব্যাখ্যা করবে । উদাহরণস্বরূপ আউটপুট pygmentizeকাজ করবে তবে এটি ব্যর্থ হবে ls --color=auto

উপরের পরিস্থিতিতে এটি আরও ভাল বিকল্প হিসাবে উপস্থিত হতে পারে।


watchতার জন্য বিদ্যমান, এটি আমি কিছুটা অযথা যা বলব
ব্রুনো পেরেইরা

14
আমি দাবি করছি না এই উত্তরটি প্রথম স্থানে ব্যবহার করা হবে। watchবেশিরভাগ ক্ষেত্রেই ভাল। এই কারণেই আমি শুরুতে "নক্সের উত্তর বাদে" উল্লেখ করেছি। তবে watchউদাহরণস্বরূপ কয়েকটি সমস্যা রয়েছে যার সাথে কেউ কোনও এলিয়াস কমান্ড ব্যবহার করতে পারে নাwatch । উদাহরণস্বরূপ নিন llযা aliised হয় ls -laFকিন্তু ব্যবহার করা যাবে না watch। এছাড়াও যদি কোনও কমান্ডের আউটপুট বেশ দীর্ঘ হয় তবে আপনি ব্যবহার করে স্ক্রোলিং করতে সমস্যায় পড়বেন watch। এই কয়েকটি বিশেষ ক্ষেত্রে এই উত্তরটি আরও ভাল বিকল্প হিসাবে উপস্থিত হতে পারে।
সৌরভসি

@ সৌরভ watchকমপক্ষে আমার সংস্করণটি রঙিন আউটপুটের জন্য -cবা --colorবিকল্পগুলির অনুমতি দেয় ।
লিলি চুং

8
while sleep xআরও ভাল - এটি হত্যা করা সহজ।
d33tah

3
এটি একটি দুর্দান্ত বিকল্প এবং এর বিপরীতে watchএটি কমান্ডের ইতিহাস রাখে।
adelriosantiago

34

শুধু পিচ চেয়েছিলেন souravc এবং nux এর উত্তর:

  1. যদিও watchউদাহরণস্বরূপ FreeBSD 'র উপর, ঘড়ি "অন্য TTY লাইনে স্নুপ" করার জন্য একটি কমান্ড - উবুন্টু উপর পুরোপুরি কাজ করবে, আপনি এড়াতে যে আপনি যদি আপনার "ইউনিক্স-Fu" বিশুদ্ধ হতে চান করতে পারেন।
  2. while true; do command; sleep SECONDS; doneএছাড়াও একটি সতর্কতা আছে - আপনার কমান্ড সিটিআর + সি ব্যবহার করে হত্যা করা আরও কঠিন হতে পারে । আপনি পছন্দ করতে চাইতে পারেন while sleep SECONDS; do command; done- এটি কেবল খাটো নয়, বাধা দেওয়াও সহজ। সাবধানবাণীটি হ'ল এটি প্রথমে ঘুমাবে, তারপরে আপনার কমান্ডটি পরিচালনা করুন, যাতে কমান্ডের SECONDSপ্রথম ঘটনাটি ঘটে যাওয়ার আগে আপনাকে কিছুটা অপেক্ষা করতে হবে।

2
আশা করি এটি কোনও মন্তব্যের পরিবর্তে উত্তর হিসাবে গ্রহণযোগ্য - আমি এখানে অন্য একটি সমাধান দেখাতে চেয়েছিলাম এবং মন্তব্য করা আমাকে কম মনোযোগ দেবে।
d33tah

কেন ঠিক ব্যাপার যেখানে আপনি করা sleepমধ্যে whileলুপ? আমি কোনও পার্থক্য খুঁজে পেলাম না, Ctrl + C তাত্ক্ষণিকভাবে লুপটি ভেঙে ফেলল যাই হোক না কেন।
মিষ্টান্ন

@ ডিজিটার: আপনি যে অনুমানটি থেকে বেরোনোর ​​চেষ্টা করছেন তার উপর নির্ভর করে। সাধারণত, সিআরটিএল + সি কেবল আপনার commandএবং মেরে ফেললে sleepকেবল ভেঙে যায় true
d33tah

11

cronডেমনের জন্য আদর্শ টাস্কের মতো মনে হয় যা পর্যায়ক্রমিক কমান্ডগুলি চালনার অনুমতি দেয়। crontab -eআপনার ব্যবহারকারীর ক্রোন কনফিগারেশন সম্পাদনা করতে কমান্ডটি চালান । এর বিন্যাসটি ক্রন্টব (5) এ নথিভুক্ত করা হয়েছে । মূলত আপনার পাঁচটি সময় সম্পর্কিত, স্থান-বিচ্ছিন্ন ক্ষেত্র রয়েছে যার পরে একটি আদেশ থাকবে:

The time and date fields are:

       field          allowed values
       -----          --------------
       minute         0-59
       hour           0-23
       day of month   1-31
       month          1-12 (or names, see below)
       day of week    0-7 (0 or 7 is Sunday, or use names)

উদাহরণস্বরূপ, আপনি যদি প্রতি মঙ্গলবার 11 টা সকালে পাইথন স্ক্রিপ্টটি চালাতে চান:

0 11 * * 1 python ~/yourscript.py

কিছু বিশেষ নামও রয়েছে যা সময়কে প্রতিস্থাপন করে, যেমন @reboot। আপনার যদি একটি অস্থায়ী ডিরেক্টরি তৈরি করতে হয় তবে খুব সহায়ক। আমার ক্রোনটাব থেকে (তালিকাভুক্ত crontab -l):

# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"

4
টার্মিনালে পর্যায়ক্রমে কীভাবে কিছু চালানো যায় তা প্রশ্ন জিজ্ঞাসা করে। cronটার্মিনালের চেয়ে পর্দার আড়ালে চলে
উত্তর-ব্র্যাডলি

5

আপনি যদি ফাইল সিস্টেমটি নিরীক্ষণ করেন তবে inotifywaitউজ্জ্বল এবং অবশ্যই আপনার সিস্টেমে কম লোড যুক্ত করে।

উদাহরণ:

ইন 1 ম টার্মিনাল এই কমান্ড টাইপ করুন:

$ inotifywait .

তারপরে ২ য় টার্মিনালে যে কোনও কমান্ড বর্তমান ডিরেক্টরিকে প্রভাবিত করে,

$ touch newfile

তারপরে মূল টার্মিনাল ইনোটিফয়েট জেগে উঠবে এবং ইভেন্টটির প্রতিবেদন করবে

./ CREATE newfile2

বা একটি লুপে

$ while true ; do inotifywait . ; done
Setting up watches.  
Watches established.
./ OPEN newfile2
Setting up watches.  
Watches established.
./ OPEN newfile2
Setting up watches.  
Watches established.
./ DELETE newfile
Setting up watches.  
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.  
Watches established.

ব্যবহারকারী আপনাকে বলেছিল, কোনও স্ক্রিপ্ট নেই, এবং সম্ভবত সে কোনও কিছুই পর্যবেক্ষণ করতে চায় না
nux

3
আমি তাকে স্ক্রিপ্ট লিখতে বলিনি, আমি প্রস্তাব দিয়েছিলাম যে যদি তারা নির্দিষ্ট ফাইল সিস্টেমের ইভেন্টটি দেখার জন্য যদি লন্ডিংয়ের ব্যবস্থা করে থাকে তবে ইনোটাইফয়েট দরকারী, এবং কোনও আদেশ পুনরাবৃত্তি করার চেয়ে কম সংস্থান ব্যবহার করে। আমি প্রায়শই একটি কমান্ড লাইনে বেশ কয়েকটি কমান্ড চালিত করি যেমন grep something InALogFile|lessএকটি স্ক্রিপ্ট?
এক্স টিয়ান

এটি একটি ভাল উত্তর, আরও সাধারণ দেখতে এটি সম্পাদনা করার চেষ্টা করুন।
নাক্স

3
.কমান্ডটি আমি ছাড়তে পারি না তার চেয়ে সহজ আর কী হতে পারে ।
এক্স টিয়ান

ধন্যবাদ @ এক্সটিয়ান, একটি দুর্দান্ত আদেশ। আমি এখন ম্যান পৃষ্ঠাতেও দেখেছি যা আপনি -mক্রমাগত একটি লুপ ছাড়াই নিরীক্ষণ করতে পারেন ।
yoniLavi

4

repeatনিম্নলিখিত পদক্ষেপগুলি সম্পাদন করে আপনি নিজের কমান্ড তৈরি করতে পারেন ; এখানে ক্রেডিট :

প্রথমে আপনার .bash_aliasesফাইলটি খুলুন :

$ xdg-open ~/.bash-aliases

দ্বিতীয়ত, ফাইলের নীচে এই লাইনগুলি পেস্ট করুন এবং সংরক্ষণ করুন:

repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
    "$@"
done
}

তৃতীয়ত, হয় বন্ধ করে আবার আপনার টার্মিনালটি আবার খুলুন, বা টাইপ করুন:

$ source ~/.bash_aliases

এট ভয়েইল! আপনি এখন এটি এর মতো ব্যবহার করতে পারেন:

$ repeat 5 echo Hello World !!!

অথবা

$ repeat 5 ./myscript.sh

এক্সডিজি-ওপেন line / .বাশ-এলিয়াসগুলি লাইনে একটি ছোট টাইপ রয়েছে। এটি হওয়া উচিত: এক্সডিজি-ওপেন ~ / .বাশ_লিয়াসগুলি (অর্থাত: আন্ডারস্কোর)
সিনসফড

4

আপনি crontab ব্যবহার করতে পারেন। কমান্ডটি চালনা করুন crontab -eএবং এটি আপনার পছন্দের পাঠ্য সম্পাদক দিয়ে খুলুন, তারপরে এই লাইনটি যুক্ত করুন

*/10 * * * *  /path-to-your-command

এটি প্রতি 10 মিনিটে আপনার আদেশটি চালাবে

* */4 * * *  /path-to-your-command

এটি প্রতি 4 ঘন্টা পরে আপনার কমান্ড চালাবে

আর একটি সম্ভাব্য সমাধান

$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done

বার বার এক্স সংখ্যা।

ওয়াই সময় পুনরাবৃত্তি অপেক্ষা।

উদাহরণ:

$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done

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

অতিরিক্ত পরিবর্তনশীল সরান
মেথাক্স

3

উপরে প্রস্তাবিত "ঘড়ি" পদ্ধতির সাথে আরেকটি উদ্বেগ হ'ল প্রক্রিয়াটি কেবল তখনই ফলাফলটি প্রদর্শন করে। "তারিখ; ঘুম 58; তারিখ" 2 তারিখগুলি কেবল 59 সেকেন্ডের পরে প্রদর্শন করবে ... আপনি যদি 4 মিনিটের জন্য কিছু চালনা শুরু করেন, যা ধীরে ধীরে একাধিক পৃষ্ঠাগুলির সামগ্রী প্রদর্শন করে, আপনি এটি সত্যিই দেখতে পাবেন না।

অন্যদিকে, "যখন" পদ্ধতির সাথে উদ্বেগটি হ'ল এটি কার্যকালীন সময়টিকে বিবেচনায় নেয় না।

while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done

এটির সাথে স্ক্রিপ্টটি প্রতি মিনিটে এক সময় চলবে, কিছু সময় 1m40 লাগতে পারে। সুতরাং যদি কোনও ক্রোন প্রতি মিনিটে এটি চালাতে সক্ষম হয় তবে এটি তা করবে না।

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

কিছুটা এইরকম:

while ( true ); do
  echo Date starting `date`
  before=`date +%s`
  sleep `echo $(( ( RANDOM % 30 )  + 1 ))`
  echo Before waiting `date`
  after=`date +%s`
  DELAY=`echo "60-($after-$before)" | bc`
  sleep $DELAY
  echo Done waiting `date`
done

এটি এটিকে আউটপুট দেবে:

আপনি দেখতে পাচ্ছেন, প্রতি মিনিটে কমান্ডটি চালিত হয়:

Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015

Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015

আপনি কেবল echo $(( ( RANDOM % 30 ) + 1 ))যা চান তার সাথে "স্লিপ " কমান্ডটি প্রতিস্থাপন করুন এবং এটি টার্মিনাল / শেলটিতে ঠিক প্রতি মিনিটেই চালানো হবে। আপনি যদি অন্য সময়সূচী চান, তবে আপনার যা প্রয়োজন তা কেবল "60" সেকেন্ডে পরিবর্তন করুন।

ডিবাগ লাইন ছাড়াই সংক্ষিপ্ত সংস্করণ:

while ( true ); do
  before=`date +%s`
  sleep `echo $(( ( RANDOM % 30 )  + 1 ))` # Place you command here
  after=`date +%s`
  DELAY=`echo "60-($after-$before)" | bc`
  sleep $DELAY
done

আমার জবাব ... আপনার কমান্ডটি আপনার কনফিগার করার বিলম্বের চেয়ে বেশি সময় নিলে, LAY DELAY একটি নেতিবাচক মান পাবে এবং স্লিপ কমান্ড ব্যর্থ হবে তাই স্ক্রিপ্টটি এখনই পুনরায় চালু হবে। সে সম্পর্কে সচেতন হওয়া দরকার।
jmspaggi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.