Terminalde her x zaman aralığını tekrarlayın.

123

Her zaman aralığındaki bir komutu tekrarlayabilirim , böylece denetleme veya izleme dizinleri için komutları çalıştırmama izin verecek?

Komut dosyasına gerek yok, terminalde yürütülmesi gereken basit bir komuta ihtiyacım var.

    
sordu muru 06.03.2014 16:52

8 cevap

188

watch komutunu kullanabilirsiniz, watch (düzenli aralıklarla belirlenmiş herhangi bir komutu çalıştırmak için kullanılır).

Terminali açın ve yazın:

watch -n x <your command>

İstediğiniz saniye cinsinden olmak için x 'i değiştirin.

watch komutunu ve seçeneklerini kullanma konusunda daha fazla yardım için, man watch dosyasını çalıştırın veya bu Bağlantı 'yı ziyaret edin.

Örneğin: , aşağıdaki değişiklikleri, her bir 60s listesini, herhangi bir değişiklik gerçekleştiğini anlayabilmeniz için Masaüstü Dizininin içeriğini listeler:

watch -n 60 ls -l ~/Desktop
    
verilen cevap nux 06.03.2014 16:54
75

Ayrıca bu komutu nux'un cevabı dışında terminalde de kullanabilirsiniz:

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

Örnek

while true; do ls; sleep 2; done

Bu komut, ls 'sinin çıktısını 2 saniyelik bir aralıkta basacaktır.

İşlemi durdurmak için Ctrl + C tuşlarını kullanın.

watch 'nın birkaç dezavantajı var

  • Herhangi bir takma ad kullanamaz.
  • Herhangi bir komutun çıkışı oldukça uzunsa, kaydırma düzgün şekilde çalışmıyor.
  • Belirli bir değerin ötesinde maksimum zaman aralığını ayarlamak için bazı sorunlar var.
  • watch , -c veya --color seçeneğini kullanarak çıkış karakterlerini geçen ANSI renk dizilerini yorumlayacaktır. Örneğin, pygmentize çıktısı çalışacak, ancak ls --color=auto için başarısız olacaktır.

Yukarıdaki durumlarda bu daha iyi bir seçenek olarak görünebilir.

    
verilen cevap souravc 06.03.2014 17:00
31

Sadece souravc ve nux 'in cevaplarını vermek istedim:

  1. watch Ubuntu'da mükemmel bir şekilde çalışacaksa, örneğin "Unix-fu" unuzu - örneğin FreeBSD'de - istiyorsanız, izlemek için "başka bir tty çizgisi üzerinde snoop" komutu vermekten kaçınmak isteyebilirsiniz.
  2. while true; do command; sleep SECONDS; done ayrıca bir uyarıya sahiptir - komutunuzun CTR + C kullanarak öldürmek daha zor olabilir. while sleep SECONDS; do command; done 'i tercih etmek isteyebilirsiniz - bu sadece daha kısa değil, aynı zamanda daha da kolay bir şekilde kesilebilir. Uyarı ilk önce uyuyacak, ardından komutunu çalıştıracak, bu yüzden komutun ilk ortaya çıkmasından önce SECONDS beklemeniz gerekecek.
verilen cevap d33tah 08.03.2014 16:51
11

Periyodik komutların çalıştırılmasına izin veren cron daemon için ideal görev gibi görünüyor. Kullanıcınızın cron yapılandırmasını düzenlemeye başlamak için crontab -e komutunu çalıştırın. Biçimi, crontab (5) belgesinde belgelenmiştir. Temelde, zamanla ilişkili, alanla ayrılmış beş alan vardır ve ardından bir komut:

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)

Örneğin, her Salı 11: 00'de bir Python komut dosyasını çalıştırmak isterseniz:

0 11 * * 1 python ~/yourscript.py

Ayrıca zamanı @reboot gibi değiştiren bazı özel adlar da vardır. Geçici bir dizin oluşturmanız gerekiyorsa çok yararlıdır. Crontab'ımdan ( crontab -l ile listeleniyor):

# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
    
verilen cevap Lekensteyn 07.03.2014 19:54
4

Dosya sistemini izliyorsanız, inotifywait parlaktır ve kesinlikle sisteminize daha az yük ekler.

Örnek:

1 terminalinde şu komutu yazın:

$ inotifywait .

Sonra 2 terminalinde, geçerli dizini etkileyen herhangi bir komut,

$ touch newfile

Sonra orijinal terminalde inotifywait uyanacak ve etkinliği bildirecek

./ CREATE newfile2

Veya bir döngüde

$ 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.
    
verilen cevap X Tian 06.03.2014 17:35
4

Aşağıdaki adımları yaparak kendi repeat komutunuzu oluşturabilirsiniz. buradaki krediler :

Önce, .bash_aliases dosyanızı açın:

$ xdg-open ~/.bash-aliases

İkincisi, bu satırları dosyanın altına yapıştırın ve kaydedin:

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

Üçüncü olarak, terminalinizi kapatıp tekrar açın veya şunu yazın:

$ source ~/.bash_aliases

Et voilà! Şimdi bunu şu şekilde kullanabilirsiniz:

$ repeat 5 echo Hello World !!!

veya

$ repeat 5 ./myscript.sh
    
verilen cevap Blufter 08.08.2014 21:38
4

crontab'i kullanabilirsiniz. crontab -e komutunu çalıştırın ve tercih ettiğiniz metin düzenleyicisiyle açın, ardından bu satırı ekleyin

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

Bu, her 10 dakikada bir komutunuzu çalıştıracaktır

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

Bu, her 4 saatte bir komutunu çalıştıracaktır

Başka bir olası çözüm

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

X tekrarlanacak tekrar sayısı.

Y tekrarlanmasını beklemek için zaman.

Örnek:

$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
    
verilen cevap Maythux 07.03.2014 06:57
1

Yukarıda önerilen "izleme" yaklaşımıyla ilgili bir başka endişe, sonucu yalnızca işlem yapıldığında göstermesidir. "tarih; uyku 58; tarih", 2 tarihi yalnızca 59 saniyeden sonra gösterecektir ... 4 dakika boyunca çalışan bir şeye başlarsanız, bu içeriğin birden çok sayfasını yavaşça görüntülerseniz, onu gerçekten görmezsiniz.

Öte yandan, "süre" yaklaşımındaki endişe, görev süresini dikkate almamasıdır.

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

Bununla birlikte, komut dosyası her dakika bir süre çalışacaktır, bazen 1m40 alabilir. Yani bir cron her dakika onu çalıştırabilse bile, bu olmayacaktır.

Oluşturulduğu gibi kabuğu üzerindeki çıktıyı görmek ve tam istek süresini beklemek için, önce ve sonra zamana bakmanız ve süre ile döngü yapmanız gerekir.

Gibi bir şey:

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

Bu, şu sonucu verecektir:

Gördüğünüz gibi, komut her dakika çalışır:

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

Yani sadece " echo $(( ( RANDOM % 30 ) + 1 )) " komutunu, istediğiniz her şeyle değiştirin ve bu, terminal / kabukta, tam olarak her dakika çalışacaktır. Başka bir program isterseniz, "60" saniyenizi ihtiyacınız olan şeyle değiştirin.

Hata ayıklama satırları olmadan daha kısa sürüm:

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
    
verilen cevap jmspaggi 14.12.2015 21:56

Etiketlerdeki diğer soruları oku