Linux'ta komutu otomatik olarak tekrarla


303

Linux komut satırında her n saniyede bir komutun tekrarlanması mümkün müdür ?

Diyelim ki bir ithalatım var ve yapıyorum

ls -l

dosya boyutunun artıp artmadığını kontrol etmek için. Bu işlemin otomatik olarak tekrarlanması için bir komut istiyorum.

Yanıtlar:


541

Her 5 saniyede bir izleyin ...

watch -n 5 ls -l

Değişikliklerin görsel olarak onaylanmasını istiyorsanız --differences, lskomutun önüne ekleyin .

OSX kılavuz sayfasına göre,

--Cumulative seçeneği "yapışkan" vurguyu yaparak, değişen tüm konumların çalışan bir görüntüsünü sunar. -T veya --no-title seçeneği, ekranın üstündeki aralık, komut ve geçerli saati ve aşağıdaki boş satırı gösteren üstbilgiyi kapatır.

Linux / Unix kılavuz sayfası burada bulunabilir


4
Nis - Komut satırına sonuç eklemeyen pitty
Marty Wallace

1
Değişikliklerin vurgulanmasını sağlayan yanıtlama seçeneği eklendi
Rawkode

3
İzlediğiniz komutun bir parçası olan özel karakterlerden kaçmanız gerektiğini unutmayın, örneğin: watch mysql dbname -e \"show processlist\;\"
pfrenssen

11
brew install watch
Josh Unger

1
saat Mac OS X 10.10 üzerine kurulmamış
João Nunes

118
while true; do
    sleep 5
    ls -l
done

10
watchAyrıca ekranı temizlemenin talihsiz yan etkisi vardır, bu nedenle bazen döngü yararlıdır. Hangisinin kullanılacağı, çıkışın istenen biçimine bağlıdır.
William Pursell

Genellikle döngüyü yaparım, ama bir satırda yaparım. Saat çok daha iyi görünüyor, ancak buna geçmem gerekecek.
Don Branson

1
@MartyWallace Bu, komut satırı (while döngüsü) ile yapılabilir.
keyser

--differencesBunları vurgulamak için kullanabileceğinizi belirtmek gerekir (Terminalin yeniden boyanması konusunda endişeleriniz varsa)
Rawkode

Bu daha iyidir watch. Saat, örneğin her çağrıda rasgele sayı oluşturmak istediğinizde çalışmaz, örn watch -n 1 echo ${RANDOM}. Rastgele sadece bir kez çağrılır.
Marcin

92

"watch", Busybox'ta bir saniyenin kesirlerine izin vermezken, "sleep" buna izin verir. Bu sizin için önemliyse, şunu deneyin:

while true; do ls -l; sleep .5; done

1
Bu, çıktıyı bir yere borulamanız gerektiğinde yararlıdır (bar aint özyinelemeli gibi)
Stephen Smith

1
Teşekkürler. Bu, watch komutu olmayan meşgul kutusu konsolları için geçerlidir. Bunu sistemimin çalışma süresini ölçmek için kullandım: gerçekken; çalışma süresi yapmak; uyku 1; bitti
Santiago Villafuerte

Meşgul kutusunun eski sürümü FWIW (v1.11.2) Sıkıştım, saat yok ve uyku kesirleri desteklemiyor. Ancak uyku 1'i başarıyla kullanabilirsiniz.
moodboom

Bu ayrıca cygwin'de çalıştırmak için harika bir yoldur
Bradley

34

sleepzaten döner 0. Bu nedenle, kullanıyorum:

while sleep 3 ; do ls -l ; done

Bu, mikhail'in çözümünden biraz daha kısa. Küçük bir dezavantaj, hedef komutu ilk kez çalıştırmadan önce uyumasıdır.


18

Komut, dikey çizgi ve tırnak işaretleri gibi bazı özel karakterler içeriyorsa, komutun tırnak işaretleri ile doldurulması gerekir. Örneğin, tekrarlamak içinls -l | grep "txt" için watch komutu şöyle olmalıdır:

watch -n 5 'ls -l | grep "txt"'


Borulu bir ifade üzerinde düzgün çalışmak için saat elde etmekte sorun yaşıyordum, ama bunu okuduktan sonra düzeltebilirim :)
elysium

13

Gittiğimizde cron olmadan periyodik olarak komut çalıştırmak mümkündür while.

Komut olarak:

while true ; do command ; sleep 100 ; done &
[ ex: # while true;  do echo `date` ; sleep 2 ; done & ]

Misal:

while true
do echo "Hello World"
sleep 100
done &

&Döngünüzü arka plana koyacağından sonuncuyu unutmayın . Ancak "ps -ef | grep your_script" komutuyla işlem kimliğini bulmanız gerekir, o zaman onu öldürmeniz gerekir. Bu yüzden lütfen betiği çalıştırırken '&' işaretini ekleyin.

# ./while_check.sh &

İşte bir script ile aynı döngü. "While_check.sh" dosyası oluşturun ve bunu içine koyun:

#!/bin/bash
while true; do 
    echo "Hello World" # Substitute this line for whatever command you want.
    sleep 100
done

Sonra yazarak çalıştırın bash ./while_check.sh &


Sonuncusu, sonun başına & olmadan komut yazmakla değil, betiği &: bash ./while_check.sh & ile çağırmakla aynı şey değil mi?
ransh

@ransh: ./while_check.sh komut dosyasını çalıştırabiliriz, böylece & in komut dosyasını eklediğimizde ve komut dosyasını & olmadan çalıştırdığımızda işlem kimliğini hemen alabiliriz, ancak herhangi bir işlem kimliği alamadık arka plan, ben düzenleme olarak biz komut dosyası durdurmak gerekiyorsa işlem kimliği almak için ps komut gerekir.
Ranjithkumar T

İsterseniz, komut dosyasını echo $!her bir arka plan işlemi başlatıldıktan sonra değiştirebilirsiniz - bu, arka planda başlatılan son alt işlemin PID'sidir.
Jonathan Leffler

echo `date` sadece yazmak için kötü ve biraz buggy bir yoldur date. (Hata, argümanın alıntı yapma eksikliği ile ilgilidir echo.) Ayrıca faydasız kullanımınaecho
Üçlü

7

izlemek iyidir ama ekranı temizler.

watch -n 1 'ps aux | grep php'

6

"Sürüklenmeden" kaçınmak istiyorsanız, yani komutun ne kadar sürdüğüne bakılmaksızın (N saniyeden daha az sürdüğü varsayılarak) komutun her N saniyede bir yürütülmesini istiyorsunuz, burada bir komutu her 5 saniyede bir ikinci doğruluk (ve devam edemezse bir uyarı yazdıracaktır):

PERIOD=5

while [ 1 ]
do
    let lastup=`date +%s`
    # do command
    let diff=`date +%s`-$lastup
    if [ "$diff" -lt "$PERIOD" ]
    then
        sleep $(($PERIOD-$diff))
    elif [ "$diff" -gt "$PERIOD" ]
    then
        echo "Command took longer than iteration period of $PERIOD seconds!"
    fi
done

Uyku sadece bir saniye kadar doğru olduğundan biraz sürüklenebilir. Date komutunu yaratıcı bir şekilde kullanarak bu doğruluğu artırabilirsiniz.


Teşekkürler .. ama 2 sorum var, 1- bu kodu nereye kaydedeceğim? başka bir deyişle, bu komut dosyasını içeren dosyayı hangi yola koymalıyım? otomatik olarak çalışmasını sağlar ?! 2- Tüm kodumu oraya yazmak yerine (# do komut) php dosyası nasıl eklenir?
Hossam

1
Bash betikleri üzerinde biraz araştırma yapmanızı öneririm, böylece bunları nasıl çalıştıracağınızı ve benzerlerini öğrenebilirsiniz.
mcote

4

Belirli bir sayıda belirli bir şey yapmak istiyorsanız, bunu her zaman yapabilirsiniz:

repeat 300 do my first command here && sleep 1.5

8
bash for x in {1..300} ; do komutları için ||break;sleep 1.5; done
Jasen

4

Aşağıdakileri çalıştırabilir ve yalnızca boyutu filtreleyebilirsiniz. Dosyanız çağrıldıysa somefilenameaşağıdakileri yapabilirsiniz

while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done

Birçok fikirden biri.


2

Kaymayı daha kolay en aza indirmek için şunu kullanın:

while :; do sleep 1m & some-command; wait; done

bash'ın döngü yapısını çalıştırma zamanı ve uyku komutunun gerçekte yürütülmesi nedeniyle hala küçük bir miktar sürüklenme olacaktır.

ipucu: ':' 0 olarak değiştirilir, yani doğru.


1
watch -n 5 'ls -l 

Koşacakls -lHer 5 saniyeden sonra komutu

Çıktı :-

Every 5.0s: ls -l                                                                                                      Fri Nov 17 16:28:25 2017

total 169548
-rw-rw-r--  1 sachin sachin     4292 Oct 18 12:16 About_us_Admission.doc
-rw-rw-r--  1 sachin sachin      865 Oct 13 15:26 About_us_At_glance.doc
-rw-rw-r--  1 sachin sachin     1816 Oct 13 16:11 About_us_Principle.doc
-rw-rw-r--  1 sachin sachin     1775 Oct 13 15:59 About_us_Vission_mission.doc
-rw-rw-r--  1 sachin sachin     1970 Oct 13 16:41 Academic_Middle_school.doc
-rw-rw-r--  1 sachin sachin      772 Oct 16 16:07 academics_High_School.doc
-rw-rw-r--  1 sachin sachin      648 Oct 16 13:34 academics_pre_primary.doc
-rw-rw-r--  1 sachin sachin      708 Oct 16 13:39 academics_primary.doc
-rwxrwxr-x  1 sachin sachin     8816 Nov  1 12:10 a.out
-rw-rw-r--  1 sachin sachin    23956 Oct 23 18:14 Ass1.c++
-rw-rw-r--  1 sachin sachin      342 Oct 23 22:13 Ass2.doc
drwxrwxr-x  2 sachin sachin     4096 Oct 19 10:45 Backtracking
drwxrwxr-x  3 sachin sachin     4096 Sep 23 20:09 BeautifulSoup
drwxrwxr-x  2 sachin sachin     4096 Nov  2 00:18 CL_1
drwxrwxr-x  2 sachin sachin     4096 Oct 23 20:16 Code
drwxr-xr-x  2 sachin sachin     4096 Nov 15 12:05 Desktop
-rw-rw-r--  1 sachin sachin        0 Oct 13 23:12 doc
drwxr-xr-x  4 sachin sachin     4096 Nov  6 21:18 Documents
drwxr-xr-x 27 sachin sachin    12288 Nov 17 13:23 Downloads
-rw-r--r--  1 sachin sachin     8980 Sep 19 23:58 examples.desktop

1

Komutu, başarısız olana kadar tekrar tekrar çalıştırmak istiyorsanız ve tüm çıktıları görmenizi sağlamak için özellikle yararlı olan özlü bir çözüm.

while ls -l; do
    sleep 5
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.