Повторіть команду автоматично в Linux


303

Чи можливо в командному рядку Linux повторити команду кожні n секунд?

Скажіть, у мене працює імпорт, і я роблю

ls -l

щоб перевірити, чи збільшується розмір файлу. Я хотів би мати команду, щоб це повторення було автоматично.

Відповіді:


541

Дивіться кожні 5 секунд ...

watch -n 5 ls -l

Якщо ви бажаєте отримати візуальне підтвердження змін, додайте --differencesдо цьогоls команди.

Відповідно до сторінки користувача OSX, також є

Параметр --cumulative робить підсвічування "липкою", представляючи працюючий дисплей усіх позицій, які коли-небудь змінювалися. Параметр -t або --no title вимикає заголовок, що відображає інтервал, команду та поточний час у верхній частині екрана, а також наступний порожній рядок.

Linux / Unix сторінка людини можна знайти тут


4
Ніцца - піти про це, не додавши результатів до командного рядка
Марті Уоллес

1
Додана опція відповіді, що дозволяє виділити зміни
Rawkode

3
Зауважте, що вам потрібно уникнути спеціальних символів, що входять до команди, яку ви переглядаєте, наприклад: watch mysql dbname -e \"show processlist\;\"
pfrenssen

11
brew install watch
Джош Унгер

1
годинник не встановлений на mac os X 10.10
João Nunes

118
while true; do
    sleep 5
    ls -l
done

10
watchтакож має невдалий побічний ефект очищення екрана, тому іноді цикл корисний. Який використовувати, залежить від потрібного формату виводу.
Вільям Перселл

Я зазвичай роблю цикл, але роблю це в одному рядку. Дивитися виглядає набагато краще, хоча мені доведеться перейти до цього.
Дон Бренсон

1
@MartyWallace Це можна зробити за допомогою командного рядка (цикл while).
клавішник

Варто відзначити, що ви можете використовувати --differencesїх для того, щоб виділити їх (Якщо вас турбує перефарбовування терміналу)
Rawkode

Це краще, ніж watch. Дивитися не працює, наприклад, коли ви хочете генерувати випадкове число у кожному виклику, наприклад watch -n 1 echo ${RANDOM}. Випадковий буде викликаний лише один раз.
Марцін

92

"watch" не дозволяє частки секунди в Busybox, тоді як "сон" робить. Якщо це має значення для вас, спробуйте це:

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

1
Це корисно, якщо вам потрібно десь подати висновок (наприклад, бар-рекурсивний)
Стівен Сміт

1
Дякую. Це працює для консолей зайнятих, у яких немає команди watch. Я використовував це для вимірювання часу роботи моєї системи: у той час як справжній; робити поновлення; сон 1; виконано
Сантьяго Віллафуерте

FWIW на старій версії zasedbox (v1.11.2) Я застряг, немає годин, і сон не підтримує дроби. Але ви можете використовувати сон 1 успішно.
настрій настрою

Це також чудовий спосіб запустити це у cygwin
Бредлі,

34

sleepвже повертається 0. Як такий, я використовую:

while sleep 3 ; do ls -l ; done

Це крихітно трохи коротше, ніж рішення Mikhail. Незначним недоліком є ​​те, що він спить перед тим, як запустити цільову команду вперше.


18

Якщо команда містить деякі спеціальні символи, такі як труби та лапки, команду потрібно залити лапками. Наприклад, щоб повторити ls -l | grep "txt", команда watch повинна бути:

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


У мене виникли проблеми з тим, щоб дивитися, як правильно працювати над трубним виразом, але прочитавши це, я міг це виправити :)
пожирав elysium

13

Запуск команд періодично без крона можливий, коли ми йдемо разом 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 &


Це не останнє & те саме, що писати команду без & врешті-решт, але викликати скрипт за допомогою &: bash ./time_check.sh &?
ransh

@ransh: Ми можемо запустити скрипт ./time_check.sh &, тому ми можемо отримати ідентифікатор процесу негайно, коли ми додамо скрипт & in і просто запустімо скрипт без &, ми не отримали жодного ідентифікатора процесу, але він запуститься тло, як я редагував, нам потрібна команда ps, щоб отримати ідентифікатор процесу, якщо нам потрібно зупинити скрипт.
Ранджіткумар T

За бажанням ви можете змінити сценарій echo $!після запуску кожного фонового процесу - це PID останнього дочірнього процесу, запущеного у фоновому режимі.
Джонатан Леффлер

echo `date` це просто бідний і злегка баггічний спосіб просто писати date. (Помилка пов'язана з відсутністю цитування аргументу до echo.) Дивіться також марне використання echo.
трійка


6

Якщо ви хочете уникнути "дрейфування", тобто ви хочете, щоб команда виконувалася кожні 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.


Дякую .. але у мене є 2 питання, 1- де зберегти цей код? Іншим словом: У який шлях я повинен розмістити файл, що містить цей сценарій? це змушує запускати автоматично ?! 2 - як включити файл php в (# do command), а не вводити там весь мій код?
Хоссам

1
Я пропоную вам трохи вивчити сценарії bash, щоб ви могли зрозуміти основи їх запуску тощо.
mcote

4

Якщо ви хочете щось робити певну кількість разів, ви завжди можете це зробити:

repeat 300 do my first command here && sleep 1.5

8
для bash виконувати for x in {1..300} ; do команди ||break;sleep 1.5; done
Ясен

4

Ви можете виконати наведене нижче та відфільтрувати лише розмір. Якщо ваш файл викликався, somefilenameви можете зробити наступне

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

Одна з багатьох ідей.


2

Щоб мінімізувати дрейф легше, використовуйте:

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

все одно буде незначна кількість дрейфу через час bash для запуску структури циклу та команди сну фактично виконати.

підказка: ':' дорівнює 0, тобто істинно.


1
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

1

Коротке рішення, яке особливо корисно, якщо ви хочете кілька разів запускати команду, поки вона не завершиться, і дозволяє вам бачити весь вихід.

while ls -l; do
    sleep 5
done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.