Lặp lại lệnh tự động trong Linux


303

Có phải trong dòng lệnh Linux có thể lặp lại lệnh sau mỗi n giây không?

Nói rằng, tôi có một nhập khẩu đang chạy, và tôi đang làm

ls -l

để kiểm tra nếu kích thước tập tin đang tăng lên. Tôi muốn có một lệnh để lặp lại điều này tự động.

Câu trả lời:


541

Xem cứ sau 5 giây ...

watch -n 5 ls -l

Nếu bạn muốn có xác nhận trực quan về các thay đổi, hãy thêm vào --differencestrướcls lệnh.

Theo trang người đàn ông OSX, cũng có

Tùy chọn --cumulation làm nổi bật "dính", hiển thị màn hình đang chạy của tất cả các vị trí đã từng thay đổi. Tùy chọn -t hoặc --no-title tắt tiêu đề hiển thị khoảng thời gian, lệnh và thời gian hiện tại ở đầu màn hình, cũng như dòng trống sau.

Trang người dùng Linux / Unix có thể được tìm thấy ở đây


4
Nice - đáng tiếc về việc nó không nối kết quả vào dòng lệnh
Marty Wallace

1
Đã thêm tùy chọn để trả lời cho phép làm nổi bật các thay đổi
Rawkode

3
Lưu ý rằng bạn cần thoát các ký tự đặc biệt là một phần của lệnh mà bạn đang xem, ví dụ: watch mysql dbname -e \"show processlist\;\"
pfrenssen

11
brew install watch
Josh Unger

1
đồng hồ chưa được cài đặt trên mac os X 10.10
João Nunes

118
while true; do
    sleep 5
    ls -l
done

10
watchcũng có tác dụng phụ đáng tiếc trong việc xóa màn hình, vì vậy đôi khi vòng lặp rất hữu ích. Việc sử dụng phụ thuộc vào định dạng mong muốn của đầu ra.
William Pursell

Tôi sẽ thường làm vòng lặp, nhưng thực hiện nó trên một dòng. Đồng hồ có vẻ tốt hơn nhiều, tuy nhiên, tôi sẽ phải chuyển sang đó.
Don Branson

1
@MartyWallace Điều này có thể được thực hiện với dòng lệnh (vòng lặp while).
keyer

Điều đáng chú ý là bạn có thể sử dụng --differencesđể làm nổi bật chúng (Nếu bạn lo lắng về việc sơn lại thiết bị đầu cuối)
Rawkode

Điều này là tốt hơn watch. Đồng hồ không hoạt động chẳng hạn khi bạn muốn tạo số ngẫu nhiên trong mỗi lần gọi, vd watch -n 1 echo ${RANDOM}. Sự ngẫu nhiên sẽ chỉ được gọi một lần.
Marcin

92

"xem" không cho phép phân số của một giây trong Busybox, trong khi "ngủ" thì không. Nếu điều đó quan trọng với bạn, hãy thử điều này:

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

1
Điều này hữu ích nếu bạn cần đặt đầu ra ở đâu đó (như đệ quy thanh aint)
Stephen Smith

1
Cảm ơn. Điều này hoạt động cho các bảng điều khiển busybox không có lệnh xem. Tôi đã sử dụng nó để đo thời gian hoạt động của hệ thống của mình: trong khi sự thật; làm thời gian hoạt động; ngủ 1; xong
Santiago Villafuerte

FWIW trên phiên bản cũ của busybox (v1.11.2) Tôi bị mắc kẹt, không có đồng hồ và giấc ngủ không hỗ trợ phân số. Nhưng bạn có thể sử dụng ngủ 1 thành công.
psychboom

Đây cũng là một cách tuyệt vời để chạy nó trong cygwin
Bradley

34

sleepđã trở lại 0. Như vậy, tôi đang sử dụng:

while sleep 3 ; do ls -l ; done

Đây là một chút ngắn hơn so với giải pháp của mikhail. Một nhược điểm nhỏ là nó ngủ trước khi chạy lệnh đích lần đầu tiên.


18

Nếu lệnh chứa một số ký tự đặc biệt như ống dẫn và dấu ngoặc kép, lệnh cần được đệm bằng dấu ngoặc kép. Ví dụ, để lặp lại ls -l | grep "txt", lệnh xem phải là:

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


Tôi đã gặp sự cố khi đồng hồ hoạt động chính xác trên biểu thức đường ống, nhưng sau khi đọc xong, tôi có thể khắc phục nó :)
elysium nuốt chửng

13

Chạy các lệnh định kỳ mà không có cron là có thể khi chúng ta đi với while.

Như một lệnh:

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

Thí dụ:

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

Đừng quên cuối cùng &vì nó sẽ đặt vòng lặp của bạn trong nền. Nhưng bạn cần tìm id tiến trình với lệnh "ps -ef | grep your_script" thì bạn cần phải giết nó. Vì vậy, vui lòng thêm '&' khi bạn chạy tập lệnh.

# ./while_check.sh &

Đây là vòng lặp tương tự như một kịch bản. Tạo tập tin "while_check.sh" và đặt nó vào trong đó:

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

Sau đó chạy nó bằng cách gõ bash ./while_check.sh &


Không phải là cuối cùng &, giống như viết lệnh mà không có & cuối cùng, nhưng gọi tập lệnh bằng &: bash ./fter_check.sh &?
chuộc

@ransh: Chúng tôi có thể chạy tập lệnh nền, như tôi đã chỉnh sửa, chúng ta cần lệnh ps để lấy id tiến trình nếu chúng ta cần dừng tập lệnh.
Ranjithkumar T

Nếu bạn muốn, bạn có thể sửa đổi tập lệnh thành echo $!sau khi mỗi quy trình nền được khởi chạy - đó là PID của quy trình con cuối cùng được khởi chạy trong nền.
Jonathan Leffler

echo `date` chỉ là một cách nghèo nàn và hơi lỗi để viết date. (Lỗi này có liên quan đến việc thiếu trích dẫn của đối số echo.) Xem thêm cách sử dụng vô dụng echo.
tripleee

7

xem là tốt nhưng sẽ làm sạch màn hình.

watch -n 1 'ps aux | grep php'

6

Nếu bạn muốn tránh "trôi", nghĩa là bạn muốn lệnh thực thi cứ sau N giây bất kể lệnh mất bao lâu (giả sử mất ít hơn N giây), đây là một số bash sẽ lặp lại lệnh cứ sau 5 giây với một- độ chính xác thứ hai (và sẽ in ra một cảnh báo nếu không thể theo kịp):

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

Nó vẫn có thể trôi đi một chút vì giấc ngủ chỉ chính xác đến một giây. Bạn có thể cải thiện độ chính xác này bằng cách sử dụng sáng tạo lệnh ngày.


Cảm ơn .. nhưng tôi có 2 câu hỏi, 1- để lưu mã đó ở đâu? nói cách khác, tôi nên đặt tập tin chứa tập lệnh đó trong đường dẫn nào? Điều đó làm cho nó chạy tự động?! 2- làm thế nào để đưa tệp php vào (lệnh # do) thay vì nhập tất cả mã của tôi vào đó?
Hossam

1
Tôi đề nghị bạn nghiên cứu một chút về các tập lệnh bash để bạn có thể hiểu những điều cơ bản về cách chạy chúng và vv.
mcote

4

Nếu bạn muốn làm một cái gì đó một số lần cụ thể, bạn luôn có thể làm điều này:

repeat 300 do my first command here && sleep 1.5

8
cho bash làm for x in {1..300} ; do lệnh ||break;sleep 1.5; done
Jasen

4

Bạn có thể chạy như sau và chỉ lọc kích thước. Nếu tập tin của bạn được gọi, somefilenamebạn có thể làm như sau

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

Một trong nhiều ý tưởng.


2

Để giảm thiểu trôi dễ dàng hơn, sử dụng:

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

vẫn sẽ có một lượng nhỏ trôi do thời gian của bash để chạy cấu trúc vòng lặp và lệnh ngủ để thực sự thực thi.

gợi ý: ':' evals thành 0 tức là đúng.


1
watch -n 5 'ls -l 

Sẽ chạy ls -llệnh sau mỗi 5s

Đầu ra: -

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

Một giải pháp ngắn gọn, đặc biệt hữu ích nếu bạn muốn chạy lệnh liên tục cho đến khi thất bại và cho phép bạn xem tất cả đầu ra.

while ls -l; do
    sleep 5
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.