Повторите команду автоматически в Linux

303

Возможно ли в командной строке Linux повторять команду каждые n секунд?

Скажем, у меня запущен импорт, и я делаю

ls -l

проверить, увеличивается ли размер файла. Я хотел бы получить команду, чтобы это повторилось автоматически.

Марти Уоллес
источник

Ответы:

541

Смотрите каждые 5 секунд ...

watch -n 5 ls -l

Если вы хотите получить визуальное подтверждение изменений, добавьте --differencesдоls командой.

Согласно справочной странице OSX, есть также

Опция --cumulative делает подсветку «липкой», отображая текущее отображение всех когда-либо измененных позиций. Параметр -t или --no-title отключает заголовок, показывающий интервал, команду и текущее время в верхней части экрана, а также следующую пустую строку.

Справочную страницу по Linux / Unix можно найти здесь

Rawkode
источник
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).
keyser
Стоит отметить, что вы можете использовать --differencesих для выделения (если вас беспокоит перекраска терминала)
Rawkode
Это лучше чем watch. Часы не работают, например, когда вы хотите генерировать случайное число в каждом вызове, например watch -n 1 echo ${RANDOM}. Случайный будет вызван только один раз.
Марцин
92

«смотреть» не позволяет доли секунды в Busybox, в то время как «спать» делает. Если это важно для вас, попробуйте это:

while true; do ls -l; sleep .5; done
михаил
источник
1
Это полезно, если вам нужно куда-то передать вывод (например, bar aint recursive)
Стивен Смит
1
Спасибо. Это работает для консолей busybox, у которых нет команды watch. Я использовал это, чтобы измерить время работы моей системы: пока верно; делать uptime; сон 1; сделано
Сантьяго Вильяфуэрте
FWIW на старой версии busybox (v1.11.2) Я застрял, нет часов, и сон не поддерживает дроби. Но вы можете использовать сон 1 успешно.
moodboom
Это также отличный способ запустить это в Cygwin
Брэдли
34

sleepуже возвращается 0. Поэтому я использую:

while sleep 3 ; do ls -l ; done

Это немного короче, чем решение Михаила. Небольшим недостатком является то, что он спит перед первым запуском целевой команды.

Себастьян Вагнер
источник
18

Если команда содержит некоторые специальные символы, такие как каналы и кавычки, ее необходимо дополнить кавычками. Например, чтобы повторить ls -l | grep "txt", команда watch должна быть:

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

jonathanzh
источник
У меня были проблемы с тем, чтобы часы работали должным образом, но после прочтения я смог это исправить :)
пожрал Elysium
13

Периодически запускать команды без cron возможно, когда мы идем с 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 ./ while_check.sh &?
ransh
@ransh: мы можем запустить скрипт ./ while_check.sh &, чтобы мы могли сразу получить идентификатор процесса, когда мы добавили скрипт & in и просто запустили скрипт без &, мы не получили никакого идентификатора процесса, но он запустится background, как я уже редактировал, нам нужна команда ps, чтобы получить идентификатор процесса, если нам нужно остановить скрипт.
Ранджиткумар Т
При желании вы можете изменить сценарий echo $!после запуска каждого фонового процесса - это PID последнего дочернего процесса, запущенного в фоновом режиме.
Джонатан Леффлер
echo `date` это просто плохой и слегка глючный способ написать просто date. (Ошибка связана с отсутствием цитирования аргумента echo.) Смотрите также бесполезное использование echo.
tripleee
7

смотреть хорошо, но будет чистить экран.

watch -n 1 'ps aux | grep php'
Эдуардо
источник
6

Если вы хотите избежать «дрейфа», то есть вы хотите, чтобы команда выполнялась каждые N секунд, независимо от того, сколько времени она занимает (предполагая, что она занимает менее N секунд), вот некоторый bash, который будет повторять команду каждые 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

Это может все еще немного дрейфовать, так как сон точен только на одну секунду. Вы можете улучшить эту точность путем творческого использования команды даты.

mcote
источник
Спасибо ... но у меня есть 2 вопроса, 1- где сохранить этот код? другими словами, по какому пути я должен поместить файл, содержащий этот скрипт? что заставляет его работать автоматически ?! 2- как включить php файл в (команда # do) вместо того, чтобы вводить весь мой код там?
Хоссам
1
Я предлагаю вам немного изучить скрипты bash, чтобы вы могли понять основы их запуска и так далее.
mcote
4

Если вы хотите сделать что-то определенное количество раз, вы всегда можете сделать это:

repeat 300 do my first command here && sleep 1.5
brightball
источник
8
для for x in {1..300} ; do команд bash do||break;sleep 1.5; done
Jasen
4

Вы можете запустить следующее и отфильтровать только размер. Если ваш файл был вызван, somefilenameвы можете сделать следующее

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

Одна из многих идей.

Валентин Байрами
источник
2

Чтобы свести к минимуму дрейф легче, используйте:

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

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

подсказка: ':' имеет значение 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
HeadAndTail
источник
1

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

while ls -l; do
    sleep 5
done
arsdragonfly
источник