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ó 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:
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 --differences
trướ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
watch mysql dbname -e \"show processlist\;\"
brew install watch
while true; do
sleep 5
ls -l
done
watch
cũ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.
--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)
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.
"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
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.
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"'
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 &
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.
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
.
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.
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, somefilename
bạ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.
watch -n 5 'ls -l
Sẽ chạy ls -l
lệnh sau mỗi 5s
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
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