Yanıtlar:
watch
Komutu kullanabilirsiniz , saatiniz belirlenen komutları düzenli aralıklarla çalıştırmak için kullanılır.
Terminali açın ve yazın:
watch -n x <your command>
x'i istediğiniz saniye cinsinden süre olarak değiştirin .
watch
Komutu ve seçeneklerini kullanma konusunda daha fazla yardım için, man watch
bu Bağlantıyı çalıştırın veya ziyaret edin .
Örneğin: Aşağıdakiler, her 60'ında , aynı Terminal'de, Desktop dizininin içeriğini listeler; böylece değişiklik olup olmadığını anlayabilirsiniz:
watch -n 60 ls -l ~/Desktop
watch
"Tarih etkin" type komutuyla kullanmanın bir yolu var mı ? Kullanmayı seviyorum watch
, ama bazen sadece sonuncusu yerine önceki uygulamaların bir kaydını da görmeyi tercih ederim. Ve evet, bunu yapmak için scripting ( while true
) kullanabileceğimi biliyorum , ancak watch
fayda kullanmak çok daha temiz!
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
2 saniyelik bir aralıkta çıktı yazdıracaktır .
İşlemi durdurmak için Ctrl+ kullanın C.
Birkaç dezavantajı var watch
watch
-c
veya --color
seçenek kullanarak kaçış karakterlerini geçen ANSI renk dizilerini yorumlar . Örneğin çıktısı pygmentize
işe yarayacak ama başarısız olacak ls --color=auto
.Yukarıdaki durumlarda bu daha iyi bir seçenek olarak görünebilir.
watch
bunun için var, bu söyleyeceğim biraz işe yaramaz
watch
çoğu durumda iyidir. Bu yüzden başlangıçta "nux'un cevabından ayrı" demiştim. Ancak watch
, örneğin bir takma ad komutunu kullanamayanwatch
ile ilgili birkaç sorun var . Örneğin ll
, takma adı olan ls -laF
ancak kullanılamayan bir örneği kullanın watch
. Ayrıca herhangi bir komutun çıktısının oldukça uzun olması durumunda kaydırma kullanmakta zorlanacaksınız watch
. Bu birkaç özel durumda bu cevap daha iyi bir seçenek olarak görünebilir.
watch
en azından renklendirilmiş çıktı için -c
veya --color
seçeneklere izin verir .
while sleep x
daha iyi - öldürmek daha kolay.
watch
, komut tarihini koruyor.
Sadece souravc ve nux'un cevaplarına katılmak istedim :
watch
Ubuntu'da mükemmel bir şekilde çalışacak olsa da, "Unix-fu" nızın saf olmasını istiyorsanız, örneğin FreeBSD'de izlemek istemenizin, örneğin "başka bir tty hattında gözetlemenin" bir komut olduğunu görmekten kaçınmak isteyebilirsiniz.while true; do command; sleep SECONDS; done
Ayrıca bir ihtar var - emrinizi CTR + C kullanarak öldürmek zor olabilir . Tercih etmek isteyebilirsiniz while sleep SECONDS; do command; done
- sadece kısa değil, aynı zamanda kesilmesi de kolaydır. Dikkat, ilk önce uyuyacak, sonra komutunuzu çalıştıracaktır, bu yüzden komutun SECONDS
ilk oluşumu gerçekleşmeden önce biraz beklemeniz gerekir .sleep
içinde while
döngü? Hiçbir fark bulamadım, Ctrl + C ne olursa olsun anında döngüyü kırdı .
command
ve sleep
ve onu öldürmeye keşke kırmak true
.
cron
Periyodik komutların çalıştırılmasına izin veren daemon için ideal görev gibi görünüyor . crontab -e
Kullanıcınızın cron yapılandırmasını düzenlemeye başlamak için komutu çalıştırın . Formatı crontab (5) ile belgelenmiştir . Temel olarak, zamana bağlı, boşlukla ayrılmış beş alanınız var, ardından bir komut var:
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 betiği çalıştırmak istiyorsanız:
0 11 * * 1 python ~/yourscript.py
Zamanın yerini alan bazı özel isimler de var @reboot
. Geçici bir dizin oluşturmanız gerekirse çok faydalıdır. Benim crontab itibaren (ile listelenen crontab -l
):
# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
cron
terminal yerine sahnelerin arkasından geçiyor
Dosya sistemini izliyorsanız inotifywait
, mükemmeldir ve kesinlikle sisteminize daha az yük ekler.
Örnek :
In 1 terminalde şu komutu yazın:
$ inotifywait .
Sonra 2. terminalde, geçerli dizini etkileyen herhangi bir komut,
$ touch newfile
Sonra orijinal terminalinde inotifywait uyanacak ve olayı bildirecek
./ CREATE newfile2
Veya bir döngü içinde
$ 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.
grep something InALogFile|less
bu bir komut dosyası mı?
.
Emri veremediğimden daha basit olan ne olabilir ?
-m
sürekli bir döngü olmadan sürekli izlemek için ekleyebileceğinizi gördüm .
repeat
Aşağıdaki adımları uygulayarak kendi komutunuzu oluşturabilirsiniz ; burada kredi :
İlk önce .bash_aliases
dosyanızı açın :
$ xdg-open ~/.bash-aliases
İkinci olarak, bu satırları dosyanın altına yapıştırın ve kaydedin:
repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
"$@"
done
}
Üçüncüsü, terminalinizi kapatıp tekrar açın veya şunu yazın:
$ source ~/.bash_aliases
Et voilà! Şimdi bu şekilde kullanabilirsiniz:
$ repeat 5 echo Hello World !!!
veya
$ repeat 5 ./myscript.sh
crontab'ı kullanabilirsiniz. komutu çalıştırın ve crontab -e
tercih ettiğiniz metin editörüyle açın, sonra bu satırı ekleyin
*/10 * * * * /path-to-your-command
Bu, her 10 dakikada bir emrinizi verecek
* */4 * * * /path-to-your-command
Bu her 4 saatte bir emrinizi verecek
$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done
X tekrarlamak için kaç kez.
Tekrarlamak için bekleyeceğiniz Y zamanı.
Örnek :
$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
Yukarıda önerilen "izleme" yaklaşımıyla ilgili bir başka endişe, sadece işlem yapıldığında sonucu göstermesidir. "tarih; uyku 58; tarih" 2 tarihi yalnızca 59 saniye sonra gösterecektir ... 4 dakika boyunca çalışan bir şeye başlarsanız, yavaşça birden fazla içerik sayfası görüntülerse, onu gerçekten göremezsiniz.
Öte yandan, "süre" yaklaşımıyla ilgili 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, senaryo bazen her dakika çalışacak, bazen 1m40 sürebilir. Yani bir cron her dakika onu çalıştırabilecek olsa bile, burada olmayacak.
Bu nedenle, kabuktaki çıktının oluşturulduğu şekliyle görmesi ve tam istek süresini beklemesi 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, bunun çıktısını alacaktır:
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
Bu yüzden sadece "sleep echo $(( ( RANDOM % 30 ) + 1 ))
" komutunu istediğin şekilde değiştir ve bunun terminal / kabukta tam olarak her dakika çalıştırılacak. Başka bir program istiyorsanız, ihtiyacınız olan şeyle "60" saniyesini değiştirin.
Hata ayıklama çizgileri 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
watch -n 1 'echo $COLUMNS'
ve arasındaki farkı deneyinwatch -n 1 echo $COLUMNS
- önceki her saniye genişletilir, ancak ikincisi başlamadan önce yalnızca bir kez genişletilirwatch
.