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.
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:
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
watch mysql dbname -e \"show processlist\;\"
brew install watch
while true; do
sleep 5
ls -l
done
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.
--differencesBunları vurgulamak için kullanabileceğinizi belirtmek gerekir (Terminalin yeniden boyanması konusunda endişeleriniz varsa)
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.
"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
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.
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"'
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 &
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.
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
"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.
Belirli bir sayıda belirli bir şey yapmak istiyorsanız, bunu her zaman yapabilirsiniz:
repeat 300 do my first command here && sleep 1.5
for x in {1..300} ; do komutları için ||break;sleep 1.5; done
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.
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.
watch -n 5 'ls -l
Koşacakls -lHer 5 saniyeden sonra komutu
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
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