टर्मिनल में समय के हर x अंतराल पर एक कमांड दोहराएं?


142

मैं समय के हर अंतराल पर एक कमांड कैसे दोहरा सकता हूं , ताकि यह मुझे निर्देशिकाओं की जांच या निगरानी के लिए कमांड चलाने की अनुमति देगा ?

स्क्रिप्ट की कोई आवश्यकता नहीं है, मुझे टर्मिनल में निष्पादित होने के लिए बस एक साधारण कमांड की आवश्यकता है।

जवाबों:


219

आप watchकमांड का उपयोग कर सकते हैं , नियमित अंतराल पर किसी भी निर्दिष्ट कमांड को चलाने के लिए वॉच का उपयोग किया जाता है।

टर्मिनल खोलें और टाइप करें:

watch -n x <your command>

आप चाहते हैं कि सेकंड में समय बदलने के लिए एक्स

watchआदेश और इसके विकल्पों का उपयोग करने में अधिक मदद के लिए , man watchइस लिंक को चलाएं या जाएं ।

उदाहरण के लिए: निम्नलिखित सूचीबद्ध करेगा, प्रत्येक 60 के दशक में , एक ही टर्मिनल पर, डेस्कटॉप निर्देशिका की सामग्री ताकि आप जान सकें कि क्या कोई बदलाव हुआ है:

watch -n 60 ls -l ~/Desktop

34
+1 लेकिन विस्तार का उपयोग करते समय सावधान रहें। उदाहरण के लिए, अपने टर्मिनल का आकार बदलते समय watch -n 1 'echo $COLUMNS'और उसके बीच अंतर की कोशिश करें watch -n 1 echo $COLUMNS- पूर्व का विस्तार हर सेकंड में किया जाता है, लेकिन उत्तरार्द्ध का विस्तार केवल एक बार शुरू होने से पहले किया watch जाता है।
l0b0

यह एक जादू की तरह काम करता है ! Ty nux

समस्या मेरे पास इस समाधान के साथ है कि आप घड़ी को एक प्रक्रिया के रूप में नहीं चला सकते हैं और बस इसे पृष्ठभूमि में चल रहा है (उदाहरण के लिए और अस्वीकृत के साथ)
Cestarian

2
क्या watch"इतिहास सक्षम" प्रकार कमांड के साथ उपयोग करने का कोई तरीका है ? मैं उपयोग watchकरना पसंद करता हूं , लेकिन कभी-कभी मैं पिछले निष्पादन के एक लॉग को भी देखना पसंद करता हूं, केवल पिछले एक के बजाय। और हाँ, मुझे पता है कि मैं इसे while trueपूरा करने के लिए स्क्रिप्टिंग ( ) का उपयोग कर सकता हूं , लेकिन watchउपयोगिता का उपयोग करना बहुत साफ है!
रिनोगो

यह सरल आदेशों के लिए काम करता है, लेकिन इसके साथ काम करने वाली पाइपलाइंड कमांड्स के लिए मेरे लिए काम नहीं किया गया था .. निम्नलिखित कमांड मैंने कोशिश की थी => cat api .log | grep 'कॉलिंग' | wc -l
सुदीप भंडारी

90

आप इस आदेश का उपयोग टर्मिनल में, नक्स के उत्तर के अलावा कर सकते हैं:

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जो अलियास है, ls -laFलेकिन इसके साथ उपयोग नहीं किया जा सकता है watch। साथ ही अगर किसी कमांड का आउटपुट काफी लंबा है तो आप स्क्रॉल करने में परेशानी में होंगे watch। इन कुछ विशेष मामलों में यह उत्तर एक बेहतर विकल्प हो सकता है।
souravc

@souravc मेरा संस्करण watchकम से कम -cया --colorरंगीन उत्पादन के विकल्प की अनुमति देता है ।
लिली चुंग

8
while sleep xबेहतर है - इसे मारना आसान है।
15:33 बजे d33tah

3
यह एक अच्छा विकल्प है और इसके विपरीत watch, यह कमांड इतिहास रखता है।
adelriosantiago

34

बस souravc और nux के उत्तरों को पिच करना चाहते थे :

  1. watchउबंटू पर पूरी तरह से काम करते समय , आप इससे बचना चाह सकते हैं कि यदि आप चाहते हैं कि आपका "यूनिक्स-फ़्यू" शुद्ध हो - उदाहरण के लिए फ्रीबीएसडी पर, वॉच "एक और ट्टी लाइन पर स्नूप" करने के लिए एक कमांड है।
  2. while true; do command; sleep SECONDS; doneएक चेतावनी भी है - CTR + C का उपयोग करके मारने के लिए आपका आदेश कठिन हो सकता है । आप पसंद कर सकते हैं while sleep SECONDS; do command; done- यह न केवल कम है, बल्कि बाधित करने के लिए भी आसान है। चेतावनी यह है कि यह पहले सोएगा, फिर अपनी कमांड चलाएगा, इसलिए कमांड SECONDSकी पहली घटना होने से पहले आपको कुछ इंतजार करना होगा।

2
उम्मीद है कि यह एक टिप्पणी के बजाय एक उत्तर के रूप में स्वीकार्य है - मैं यहां एक और समाधान दिखाना चाहता था और टिप्पणी करना वास्तव में मुझे कम ध्यान देगा।
d33tah

यह वास्तव में क्यों मायने रखता है जहां आप लूप sleepमें डालते हैं while। मुझे कोई अंतर नहीं मिला, Ctrl + C ने लूप को तुरंत तोड़ दिया, इससे कोई फर्क नहीं पड़ता।
मिठाई

@ डर्टर्ट: इस बात पर निर्भर करता है कि आप क्या अनुमान लगा रहे हैं। आम तौर पर, ctrl + c सिर्फ commandऔर सिर्फ आपकी हत्या करेगा और sleepयदि आप मारेंगे तो ही टूटेंगे true
d33tah

11

cronडेमॉन के लिए आदर्श कार्य की तरह लगता है जो आवधिक आदेशों को चलाने की अनुमति देता है। crontab -eअपने उपयोगकर्ता के क्रोन कॉन्फ़िगरेशन को संपादित करने के लिए कमांड चलाएं । इसका प्रारूप crontab (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 .

तब में 2 टर्मिनल, वर्तमान निर्देशिका को प्रभावित करता है कि किसी भी आदेश,

$ touch newfile

तब मूल टर्मिनल inotifywait में जाग जाएगा और घटना की रिपोर्ट करेगा

./ 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कि एक स्क्रिप्ट?
एक्स तियान

इसका एक अच्छा जवाब, इसे और अधिक सरल दिखने के लिए संपादित करने का प्रयास करें।
nux

3
इससे आसान क्या हो सकता है कि .मैं कमान नहीं छोड़ सकता।
एक्स तियान

धन्यवाद @XTian, ​​एक महान आदेश। मैंने अब मैन पेज में भी देखा कि आप -mबिना लूप के लगातार मॉनिटर को जोड़ सकते हैं ।
16

4

आप repeatनिम्न चरणों का पालन करते हुए अपनी खुद की कमांड बना सकते हैं ; यहाँ क्रेडिट :

सबसे पहले, अपनी .bash_aliasesफ़ाइल खोलें :

$ xdg-open ~/.bash-aliases

दूसरा, इन पंक्तियों को फ़ाइल के नीचे चिपकाएँ और सहेजें:

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

तीसरा, या तो बंद करें और फिर से अपना टर्मिनल खोलें, या टाइप करें:

$ source ~/.bash_aliases

Et voilà! अब आप इसे इस तरह से उपयोग कर सकते हैं:

$ repeat 5 echo Hello World !!!

या

$ repeat 5 ./myscript.sh

लाइन में एक छोटा टाइपो है xdg-open ~ / .bash-aliases। यह होना चाहिए: xdg-open ~ / .bash_aliases (यानी: अंडरस्कोर)
ssinfod

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

दोहराने के लिए एक्स की संख्या।

Y समय दोहराने की प्रतीक्षा करें।

उदाहरण :

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

यह एक सुधार क्यों है? आपने बस एक अतिरिक्त, अनावश्यक, चरण को कमांड के रूप में एक चर के रूप में सहेज कर जोड़ा। मैं केवल बातें करता है) यह अब ii) बलों आप केवल साधारण आदेशों, कोई पाइप या रीडायरेक्ट आदि का उपयोग करने के टाइप करने के लिए बनाने के
terdon

अतिरिक्त चर निकालें
Maythux

3

ऊपर प्रस्तावित "घड़ी" दृष्टिकोण के साथ एक और चिंता का विषय यह है कि यह प्रक्रिया को पूरा करने के बाद ही परिणाम प्रदर्शित करता है। "दिनांक; नींद ५ date; तारीख" २ तारीख को केवल ५ ९ सेकंड के बाद प्रदर्शित किया जाएगा ... यदि आप ४ मिनट से कुछ चलाना शुरू करते हैं, तो धीरे-धीरे सामग्री के कई पृष्ठों को प्रदर्शित करते हैं, आप वास्तव में इसे नहीं देखेंगे।

दूसरी ओर, "जबकि" दृष्टिकोण के साथ चिंता यह है कि यह कार्य अवधि को ध्यान में नहीं रखता है।

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

अपने आप को जवाब देना ... यदि आपकी कमांड आपको कॉन्फ़िगर करने में देरी से अधिक समय लेती है, तो $ DELAY को एक नकारात्मक मान मिलेगा और स्लीप कमांड विफल हो जाएगी, इसलिए स्क्रिप्ट तुरंत पुनरारंभ हो जाएगी। इसके लिए जागरूक होने की जरूरत है।
jmspaggi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.