Ulangi perintah secara otomatis di Linux

303

Apakah mungkin dalam baris perintah Linux untuk memiliki perintah yang diulang setiap n detik?

Katakanlah, saya memiliki impor berjalan, dan saya lakukan

ls -l

untuk memeriksa apakah ukuran file meningkat. Saya ingin memiliki perintah untuk mengulang ini secara otomatis.

Marty Wallace
sumber

Jawaban:

541

Tonton setiap 5 detik ...

watch -n 5 ls -l

Jika Anda ingin mendapatkan konfirmasi visual tentang perubahan, tambahkan --differencessebelum lsperintah.

Menurut halaman manual OSX, ada juga

Opsi --cumulative membuat penyorotan "lengket", menghadirkan tampilan semua posisi yang pernah berubah. Opsi -t atau --no-title mematikan header yang menunjukkan interval, perintah, dan waktu saat ini di bagian atas layar, serta baris kosong berikut.

Halaman manual Linux / Unix dapat ditemukan di sini

Rawkode
sumber
4
Nice - pitty tentang hal itu tidak menambahkan hasil ke baris perintah
Marty Wallace
1
Menambahkan opsi untuk menjawab yang memungkinkan menyoroti perubahan
Rawkode
3
Perhatikan bahwa Anda perlu melarikan diri karakter khusus yang merupakan bagian dari perintah yang Anda tonton, misalnya: watch mysql dbname -e \"show processlist\;\"
pfrenssen
11
brew install watch
Josh Unger
1
jam tangan tidak diinstal pada mac os X 10.10
João Nunes
118
while true; do
    sleep 5
    ls -l
done
Oleksandr Kravchuk
sumber
10
watchjuga memiliki efek samping yang disayangkan membersihkan layar, jadi terkadang perulangan berguna. Yang digunakan tergantung pada format output yang diinginkan.
William Pursell
Saya biasanya akan melakukan loop, tetapi melakukannya di satu baris. Tapi menonton terlihat jauh lebih baik, saya harus beralih ke itu.
Don Branson
1
@ MartyWallace Ini dapat dilakukan dengan baris perintah (loop sementara).
keyser
Perlu dicatat bahwa Anda dapat menggunakannya --differencesuntuk menyorotnya (Jika Anda khawatir tentang pengecatan ulang terminal)
Rawkode
Ini lebih baik daripada watch. Tonton tidak berfungsi misalnya ketika Anda ingin membuat nomor acak di setiap doa, mis watch -n 1 echo ${RANDOM}. Acak hanya akan dipanggil satu kali.
Marcin
92

"menonton" tidak memungkinkan sepersekian detik di Busybox, sementara "tidur" tidak. Jika itu penting bagi Anda, coba ini:

while true; do ls -l; sleep .5; done
mikhail
sumber
1
Ini berguna untuk jika Anda perlu menyalurkan output di suatu tempat (seperti bar tidak rekursif)
Stephen Smith
1
Terima kasih. Ini berfungsi untuk konsol busybox yang tidak memiliki perintah tontonan. Saya menggunakannya untuk mengukur uptime sistem saya: sementara benar; lakukan uptime; tidur 1; selesai
Santiago Villafuerte
FWIW pada versi lama busybox (v1.11.2) Saya terjebak dengan, tidak ada arloji, dan tidur tidak mendukung fraksi. Tetapi Anda dapat menggunakan sleep 1 dengan sukses.
moodboom
Ini juga cara yang bagus untuk menjalankan ini di cygwin
Bradley
34

sleepsudah kembali 0. Karena itu, saya menggunakan:

while sleep 3 ; do ls -l ; done

Ini sedikit lebih pendek dari solusi mikhail. Kelemahan kecilnya adalah ia tidur sebelum menjalankan perintah target untuk pertama kalinya.

Sebastian Wagner
sumber
18

Jika perintah berisi beberapa karakter khusus seperti pipa dan tanda kutip, perintah harus diisi dengan tanda kutip. Misalnya, untuk mengulang ls -l | grep "txt", perintah arloji harus:

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

Jonathanzh
sumber
Saya mengalami kesulitan untuk menonton bekerja dengan baik pada ekspresi pipa, tetapi setelah membaca ini saya bisa memperbaikinya :)
melahap elysium
13

Menjalankan perintah secara berkala tanpa cron dimungkinkan saat kita menggunakannya while.

Sebagai perintah:

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

Contoh:

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

Jangan lupa yang terakhir &karena akan membuat loop Anda di latar belakang. Tetapi Anda perlu menemukan proses id dengan perintah "ps -ef | grep your_script" maka Anda harus membunuhnya. Jadi silakan tambahkan '&' saat Anda menjalankan skrip.

# ./while_check.sh &

Berikut ini adalah loop yang sama dengan skrip. Buat file "while_check.sh" dan letakkan ini di dalamnya:

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

Kemudian jalankan dengan mengetik bash ./while_check.sh &

Ranjithkumar T
sumber
Bukankah yang terakhir &, sama dengan menulis perintah tanpa & pada akhirnya, tetapi memanggil skrip dengan &: bash ./while_check.sh &?
ransh
@ transh: Kita dapat menjalankan skrip ./while_check.sh & agar kita dapat segera mendapatkan proses id, ketika kita menambahkan skrip & dalam dan jalankan skrip tanpa &, kita tidak mendapatkan id proses tetapi itu akan berjalan background, seperti yang saya edit kita perlu perintah ps untuk mendapatkan proses id jika kita perlu menghentikan skrip.
Ranjithkumar T
Jika mau, Anda dapat memodifikasi skrip echo $!setelah setiap proses latar belakang diluncurkan - itulah PID dari proses anak terakhir yang diluncurkan di latar belakang.
Jonathan Leffler
echo `date` hanya cara yang buruk dan sedikit buggy untuk menulis adil date. (Bug ada hubungannya dengan kurangnya mengutip argumen untuk echo.) Lihat juga penggunaan tidak berguna dari echo.
tripleee
7

menonton baik tetapi akan membersihkan layar.

watch -n 1 'ps aux | grep php'
Eduardo
sumber
6

Jika Anda ingin menghindari "drifting", artinya Anda menginginkan perintah untuk mengeksekusi setiap N detik terlepas dari berapa lama perintah tersebut (dengan asumsi dibutuhkan kurang dari N detik), berikut adalah beberapa bash yang akan mengulangi perintah setiap 5 detik dengan satu- akurasi kedua (dan akan mencetak peringatan jika tidak bisa mengikuti):

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

Mungkin masih sedikit melayang karena tidur hanya akurat untuk satu detik. Anda dapat meningkatkan akurasi ini dengan menggunakan perintah tanggal secara kreatif.

mcote
sumber
Terima kasih .. tapi saya punya 2 pertanyaan, 1 - di mana menyimpan kode itu? dengan kata lain, Di jalur mana saya harus meletakkan file yang berisi skrip itu? yang membuatnya berjalan secara otomatis ?! 2- bagaimana cara memasukkan file php di (# do command) alih-alih mengetik semua kode saya di sana?
Hossam
1
Saya sarankan Anda melakukan riset sedikit pada skrip bash sehingga Anda dapat memahami dasar-dasar cara menjalankannya dan sebagainya.
mcote
4

Jika Anda ingin melakukan sesuatu beberapa kali Anda selalu dapat melakukan ini:

repeat 300 do my first command here && sleep 1.5
bola terang
sumber
8
untuk for x in {1..300} ; do perintah bash do||break;sleep 1.5; done
Jasen
4

Anda dapat menjalankan yang berikut ini dan memfilter ukurannya saja. Jika file Anda disebut somefilenameAnda dapat melakukan hal berikut

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

Salah satu dari banyak ide.

Valentin Bajrami
sumber
2

Untuk meminimalkan penyimpangan lebih mudah, gunakan:

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

masih akan ada sejumlah kecil penyimpangan karena waktu bash untuk menjalankan struktur loop dan perintah sleep untuk benar-benar mengeksekusi.

petunjuk: ':' evals to 0 ie true.

matematika
sumber
1
watch -n 5 'ls -l 

Akan Menjalankan ls -lperintah setelah setiap 5s

Output: -

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
HeadAndTail
sumber
1

Solusi singkat, yang sangat berguna jika Anda ingin menjalankan perintah berulang kali sampai gagal, dan memungkinkan Anda melihat semua output.

while ls -l; do
    sleep 5
done
arsdragonfly
sumber