Повторить команду каждый x интервал времени в терминале?

Как я могу повторить команду каждый интервал времени, так, чтобы она позволила мне командам выполнения для проверки или контроля каталогов?

Нет никакой потребности в сценарии, мне нужна просто простая команда, которая будет выполняться в терминале.

172
задан 27 December 2016 в 00:59

10 ответов

Вы можете использовать команду watch , watch используется для запуска любой назначенной команды через равные промежутки времени.

Откройте терминал и введите:

watch -n x <your command>

change x , чтобы указать желаемое время в секундах.

Чтобы получить дополнительную помощь по команде watch и ее параметрам, запустите man watch или посетите эту ссылку .

Например: следующее будет перечислять каждые 60 секунд на том же Терминале содержимое каталога рабочего стола, чтобы вы могли узнать, произошли ли какие-либо изменения:

watch -n 60 ls -l ~/Desktop
239
ответ дан 22 November 2019 в 22:51

Вы также можете использовать эту команду в терминале, кроме ответа nux:

while true; do <your_command>; sleep <interval_in_seconds>; done

Пример

while true; do ls; sleep 2; done

Эта команда распечатает вывод ls с интервалом в 2 секунды.

Используйте Ctrl + C , чтобы остановить процесс.

У watch

  • есть несколько недостатков. Он не может использовать команды с псевдонимом.
  • Если вывод какой-либо команды слишком длинный, прокрутка не работает должным образом.
  • Существует некоторая проблема с установкой максимального временного интервала сверх определенного значения.
  • watch интерпретирует цветовые последовательности ANSI. передача управляющих символов с помощью параметра -c или - color . Например, вывод pygmentize будет работать, но не будет работать для ls --color = auto .

В вышеупомянутых обстоятельствах это может показаться лучшим вариантом.

104
ответ дан 22 November 2019 в 22:51

Просто хотел ответить на souravc и nux ответы:

  1. Хотя часы будут отлично работать на Ubuntu, вы можете избежать этого, если хотите, чтобы ваш "Unix-fu" был чистым - например, во FreeBSD watch - это команда для "отслеживания другой линии tty".
  2. while true; сделать команду; спать СЕКУНДЫ; done также имеет предостережение - вашу команду может быть труднее убить с помощью CTR + C . Вы можете предпочесть во время сна СЕКУНДЫ; сделать команду; done - это не только короче, но и проще прервать. Предостережение состоит в том, что сначала он перейдет в спящий режим, а затем выполнит вашу команду, поэтому вам нужно подождать несколько СЕКУНД , прежде чем произойдет первое вхождение команды.
37
ответ дан 22 November 2019 в 22:51

Похоже, идеальная задача для демона cron , который позволяет запускать периодические команды. Запустите команду crontab -e , чтобы начать редактирование конфигурации cron вашего пользователя. Его формат задокументирован в crontab (5) . Обычно у вас есть пять связанных со временем полей, разделенных пробелами, за которыми следует команда:

The time and date fields are:

       field          allowed values
       -----          --------------
       minute         0-59
       hour           0-23
       day of month   1-31
       month          1-12 (or names, see below)
       day of week    0-7 (0 or 7 is Sunday, or use names)

Например, если вы хотите запускать скрипт Python каждый вторник, 11:00:

0 11 * * 1 python ~/yourscript.py

Есть также некоторые специальные имена, которые заменяют время, например @reboot . Очень полезно, если вам нужно создать временный каталог. Из моего crontab (перечисленного как crontab -l ):

# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
12
ответ дан 22 November 2019 в 22:51

Вы вы можете создать свою команду repeat , выполнив следующие шаги; кредитов здесь :

Во-первых, откройте ваш файл .bash_aliases :

$ xdg-open ~/.bash-aliases

Во-вторых, вставьте эти строки в конец файла и сохраните:

repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
    "$@"
done
}

В-третьих, либо закрыть и снова откройте свой терминал или введите:

$ source ~/.bash_aliases

Et voilà! Теперь вы можете использовать его так:

$ repeat 5 echo Hello World !!!

или

$ repeat 5 ./myscript.sh
4
ответ дан 22 November 2019 в 22:51

вы можете использовать crontab. запустите команду crontab -e и откройте ее в предпочитаемом текстовом редакторе, затем добавьте эту строку

*/10 * * * *  /path-to-your-command

Это будет запускать вашу команду каждые 10 минут

* */4 * * *  /path-to-your-command

Это будет запускать вашу команду каждые 4 часа

Другое возможное решение

$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done

X количество раз для повторения.

Y время ожидания для повторения.

Пример:

$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
5
ответ дан 22 November 2019 в 22:51

Еще одна проблема, связанная с подходом "наблюдения", предложенным выше, заключается в том, что он отображает результат только после завершения процесса. «date; sleep 58; date» отобразит 2 даты только через 59 секунд ... Если вы запустите что-то в течение 4 минут, которые медленно отображают несколько страниц содержимого, вы действительно не увидите этого.

С другой стороны. рука, проблема с подходом «while» заключается в том, что он не принимает во внимание длительность задачи.

while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done

При этом сценарий будет запускаться иногда каждые минуты, иногда может занять 1 мин 40. Таким образом, даже если cron сможет запускать его каждую минуту, здесь он не будет.

Таким образом, чтобы увидеть вывод оболочки по мере его создания и дождаться точного времени запроса, вам нужно посмотреть на время до , и после, и цикл с while.

Что-то вроде:

while ( true ); do
  echo Date starting `date`
  before=`date +%s`
  sleep `echo $(( ( RANDOM % 30 )  + 1 ))`
  echo Before waiting `date`
  after=`date +%s`
  DELAY=`echo "60-($after-$before)" | bc`
  sleep $DELAY
  echo Done waiting `date`
done

Будет выведено следующее:

Как видите, команда запускается каждую минуту:

Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015

Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015

Так что просто замените "sleep echo $ (((RANDOM% 30) + 1)) "с тем, что вы хотите, и которая будет запускаться на терминале / оболочке ровно каждую минуту. Если вам нужно другое расписание, просто измените «60» секунд на то, что вам нужно.

Более короткая версия без строк отладки:

while ( true ); do
  before=`date +%s`
  sleep `echo $(( ( RANDOM % 30 )  + 1 ))` # Place you command here
  after=`date +%s`
  DELAY=`echo "60-($after-$before)" | bc`
  sleep $DELAY
done
3
ответ дан 22 November 2019 в 22:51

Если вы следите за файловой системой, то inotifywait отлично подходит и, безусловно, снижает нагрузку на вашу систему.

Пример:

В 1st терминал введите эту команду:

$ inotifywait .

Затем на 2-м терминале любая команда, которая влияет на текущий каталог,

$ touch newfile

Затем в исходном терминале inotifywait проснется и сообщит о событии

./ CREATE newfile2

Или в цикл

$ while true ; do inotifywait . ; done
Setting up watches.  
Watches established.
./ OPEN newfile2
Setting up watches.  
Watches established.
./ OPEN newfile2
Setting up watches.  
Watches established.
./ DELETE newfile
Setting up watches.  
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.  
Watches established.
5
ответ дан 22 November 2019 в 22:51
while true; do <your command>; sleep <time interval>;done

В этой строке кода: 1. процесс будет выполняться непрерывно, поскольку мы используем цикл while, 2. затем выполните выполнение команды, 3. засыпать на интервал времени

в качестве примера пока истинно; do ./git.bash;sleep 20; done эта строка автоматически отправляет мой код в GitHub каждые 20 секунд

0
ответ дан 5 January 2021 в 23:11

Даже вы можете использовать эту команду, чтобы повторить свою команду 10 раз или больше, когда она сделана

для i в {1..10}; Сделайте Ваша команда ; сделано

, например:

для i в {1..10}; Сделайте Speedtest ; Сделано

0
ответ дан 2 April 2021 в 00:56

Другие вопросы по тегам:

Похожие вопросы: