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

264

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

Например, скажем, что у меня есть импорт, и я делаю

ls -l

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

Теги:

13 ответов

482
Лучший ответ

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

watch -n 5 ls -l

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

В соответствии с man-страницей OSX также есть

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

Страница руководства Linux/Unix находится здесь

  • 3
    Приятно - жалко об этом, не добавляя результаты в командную строку
  • 1
    Добавлена опция ответа, которая позволяет подсвечивать изменения
Показать ещё 6 комментариев
101
while true; do
    sleep 5
    ls -l
done
  • 7
    watch также есть неприятный побочный эффект очистки экрана, поэтому иногда цикл полезен. Какой из них использовать, зависит от желаемого формата вывода.
  • 0
    Я обычно делаю цикл, но делаю это в одну строку. Часы выглядят намного лучше, хотя мне придется переключиться на это.
Показать ещё 6 комментариев
86

"watch" не позволяет доли секунды в Busybox, в то время как "sleep" делает. Если это имеет значение для вас, попробуйте следующее:

while true; do ls -l; sleep .5; done
  • 1
    Это полезно, если вам нужно куда-то передать вывод (например, bar aint recursive)
  • 1
    Благодарю. Это работает для консолей busybox, которые не имеют команды watch. Я использовал это, чтобы измерить время работы моей системы: пока верно; делать uptime; сон 1; сделанный
Показать ещё 2 комментария
24

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

while sleep 3 ; do ls -l ; done

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

18

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

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

  • 0
    У меня были проблемы с настройкой часов для правильной работы над выражением, но после прочтения я смог это исправить :)
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", тогда вам нужно его убить. Так что любезно добавьте '&' когда вы запускаете script.

# ./while_check.sh &

Вот тот же цикл, что и script. Создайте файл "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 &

  • 0
    Не последний &, то же самое, что написать команду без & в конце, но вызвать скрипт с &: bash ./ while_check.sh &?
  • 0
    @ransh: Мы можем запустить скрипт ./ while_check.sh &, чтобы мы могли сразу получить идентификатор процесса, когда мы добавили скрипт & in и просто запустили скрипт без &, мы не получили никакого идентификатора процесса, но он запустится фон, как я уже редактировал, нам нужна команда ps, чтобы получить идентификатор процесса, если нам нужно остановить скрипт.
Показать ещё 2 комментария
7

часы хороши, но очистят экран.

watch -n 1 'ps aux | grep php'
5

Если вы хотите избежать "дрейфа", то есть хотите, чтобы команда выполняла каждую 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

Он все еще может немного отклониться, так как сон остается точным только на одну секунду. Вы можете повысить эту точность за счет использования команды date.

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

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

repeat 300 do my first command here && sleep 1.5
  • 9
    Это работает для csh но не для bash или sh .
  • 7
    для bash do for x in {1..300} ; do команды ||break;sleep 1.5; done
4

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

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

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

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
0

Еще одна петля в bash:

Сделайте это repeat исполняемым файлом где-нибудь в вашем $PATH:

#!/bin/bash

n=$1
shift 1

for ((x=0; x<$n; ++x)); do
  "$@"
done

так что позже вы можете:

$ repeat 3 date

0

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

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

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

hint: ':' evals to 0 ie true.

  • 0
    Нет причин для -1. Компенсация +1 для тебя.
Сообщество Overcoder
Наверх
Меню