Чи можливо в командному рядку Linux повторити команду кожні n секунд?
Скажіть, у мене працює імпорт, і я роблю
ls -l
щоб перевірити, чи збільшується розмір файлу. Я хотів би мати команду, щоб це повторення було автоматично.
Чи можливо в командному рядку Linux повторити команду кожні n секунд?
Скажіть, у мене працює імпорт, і я роблю
ls -l
щоб перевірити, чи збільшується розмір файлу. Я хотів би мати команду, щоб це повторення було автоматично.
Відповіді:
Дивіться кожні 5 секунд ...
watch -n 5 ls -l
Якщо ви бажаєте отримати візуальне підтвердження змін, додайте --differences
до цьогоls
команди.
Відповідно до сторінки користувача OSX, також є
Параметр --cumulative робить підсвічування "липкою", представляючи працюючий дисплей усіх позицій, які коли-небудь змінювалися. Параметр -t або --no title вимикає заголовок, що відображає інтервал, команду та поточний час у верхній частині екрана, а також наступний порожній рядок.
Linux / Unix сторінка людини можна знайти тут
watch mysql dbname -e \"show processlist\;\"
brew install watch
while true; do
sleep 5
ls -l
done
watch
також має невдалий побічний ефект очищення екрана, тому іноді цикл корисний. Який використовувати, залежить від потрібного формату виводу.
--differences
їх для того, щоб виділити їх (Якщо вас турбує перефарбовування терміналу)
watch
. Дивитися не працює, наприклад, коли ви хочете генерувати випадкове число у кожному виклику, наприклад watch -n 1 echo ${RANDOM}
. Випадковий буде викликаний лише один раз.
"watch" не дозволяє частки секунди в Busybox, тоді як "сон" робить. Якщо це має значення для вас, спробуйте це:
while true; do ls -l; sleep .5; done
sleep
вже повертається 0
. Як такий, я використовую:
while sleep 3 ; do ls -l ; done
Це крихітно трохи коротше, ніж рішення Mikhail. Незначним недоліком є те, що він спить перед тим, як запустити цільову команду вперше.
Якщо команда містить деякі спеціальні символи, такі як труби та лапки, команду потрібно залити лапками. Наприклад, щоб повторити ls -l | grep "txt"
, команда watch повинна бути:
watch -n 5 'ls -l | grep "txt"'
Запуск команд періодично без крона можливий, коли ми йдемо разом while
.
Як команда:
while true ; do command ; sleep 100 ; done &
[ ex: # while true; do echo `date` ; sleep 2 ; done & ]
Приклад:
while true
do echo "Hello World"
sleep 100
done &
Не забувайте останнього, &
оскільки він поставить вашу петлю на задній план. Але вам потрібно знайти ідентифікатор процесу з командою "ps -ef | grep your_script", тоді вам потрібно вбити його. Тому ласкаво додайте "&" під час запуску сценарію.
# ./while_check.sh &
Ось такий самий цикл, що і сценарій. Створіть файл "while_check.sh" і вставте це в нього:
#!/bin/bash
while true; do
echo "Hello World" # Substitute this line for whatever command you want.
sleep 100
done
Потім запустіть його, ввівши bash ./while_check.sh &
echo $!
після запуску кожного фонового процесу - це PID останнього дочірнього процесу, запущеного у фоновому режимі.
echo `date`
це просто бідний і злегка баггічний спосіб просто писати date
. (Помилка пов'язана з відсутністю цитування аргументу до echo
.) Дивіться також марне використання echo
.
Якщо ви хочете уникнути "дрейфування", тобто ви хочете, щоб команда виконувалася кожні N секунд, незалежно від того, скільки часу займає команда (припускаючи, що це займає менше, ніж N секунд), ось кілька баштів, який повторюватиме команду кожні 5 секунд одно- друга точність (і буде роздруковано попередження, якщо воно не може бути в курсі):
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
Це все ще може трохи дрейфувати, оскільки сон точний лише до однієї секунди. Ви можете покращити цю точність шляхом творчого використання команди date.
Ви можете виконати наведене нижче та відфільтрувати лише розмір. Якщо ваш файл викликався, somefilename
ви можете зробити наступне
while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done
Одна з багатьох ідей.
Щоб мінімізувати дрейф легше, використовуйте:
while :; do sleep 1m & some-command; wait; done
все одно буде незначна кількість дрейфу через час bash для запуску структури циклу та команди сну фактично виконати.
підказка: ':' дорівнює 0, тобто істинно.
watch -n 5 'ls -l
Буде виконувати ls -l
команду через кожні 5 секунд
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