it-roy-ru.com

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

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

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

132
user239745

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

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

watch -n x <your command>

замените x на желаемое время в секундах.

Для получения дополнительной помощи с помощью команды watch и ее параметров, запустите man watch или посетите этот Ссылка .

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

watch -n 60 ls -l ~/Desktop
207
nux

Вы также можете использовать эту команду в терминале, кроме ответа 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.

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

85
souravc

Просто хотел включить ответы souravc и nux:

  1. Хотя watch будет отлично работать в Ubuntu, вы можете избежать этого, если вы хотите, чтобы ваш "Unix-fu" был чистым - например, во FreeBSD, watch - это команда, "отслеживающая другую строку tty".
  2. У while true; do command; sleep SECONDS; done также есть предостережение - убить вашу команду сложнее, используя CTR + C. Вы можете предпочесть while sleep SECONDS; do command; done - это не только короче, но и легче прерывать. Предостережение заключается в том, что сначала он будет переведен в спящий режим, а затем запустит вашу команду, поэтому вам придется подождать некоторое SECONDS, прежде чем произойдет первое вхождение команды.
34
d33tah

Похоже, идеальная задача для демона 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"
11
Lekensteyn

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

Пример :

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

$ inotifywait .

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

$ 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
X Tian

вы можете использовать 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
4
Maythux

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

Сначала откройте файл .bash_aliases:

$ xdg-open ~/.bash-aliases

Затем вставьте эти строки внизу файла и сохраните:

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

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

$ source ~/.bash_aliases

И вуаля ! Теперь вы можете использовать его так:

$ repeat 5 echo Hello World !!!

или же

$ repeat 5 ./myscript.sh
4
Blufter

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

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

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
jmspaggi