Как я могу повторить команду каждый интервал времени, так, чтобы она позволила мне командам выполнения для проверки или контроля каталогов?
Нет никакой потребности в сценарии, мне нужна просто простая команда, которая будет выполняться в терминале.
Вы можете использовать команду watch
, watch используется для запуска любой назначенной команды через равные промежутки времени.
Откройте терминал и введите:
watch -n x <your command>
change x , чтобы указать желаемое время в секундах.
Чтобы получить дополнительную помощь по команде watch
и ее параметрам, запустите man watch
или посетите эту ссылку .
Например: следующее будет перечислять каждые 60 секунд на том же Терминале содержимое каталога рабочего стола, чтобы вы могли узнать, произошли ли какие-либо изменения:
watch -n 60 ls -l ~/Desktop
Вы также можете использовать эту команду в терминале, кроме ответа 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
. В вышеупомянутых обстоятельствах это может показаться лучшим вариантом.
Просто хотел ответить на souravc и nux ответы:
часы
будут отлично работать на Ubuntu, вы можете избежать этого, если хотите, чтобы ваш "Unix-fu" был чистым - например, во FreeBSD watch - это команда для "отслеживания другой линии tty". while true; сделать команду; спать СЕКУНДЫ; done
также имеет предостережение - вашу команду может быть труднее убить с помощью CTR + C . Вы можете предпочесть во время сна СЕКУНДЫ; сделать команду; done
- это не только короче, но и проще прервать. Предостережение состоит в том, что сначала он перейдет в спящий режим, а затем выполнит вашу команду, поэтому вам нужно подождать несколько СЕКУНД
, прежде чем произойдет первое вхождение команды. Похоже, идеальная задача для демона 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"
Вы вы можете создать свою команду 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
вы можете использовать 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
Еще одна проблема, связанная с подходом "наблюдения", предложенным выше, заключается в том, что он отображает результат только после завершения процесса. «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
Если вы следите за файловой системой, то 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.
while true; do <your command>; sleep <time interval>;done
В этой строке кода: 1. процесс будет выполняться непрерывно, поскольку мы используем цикл while, 2. затем выполните выполнение команды, 3. засыпать на интервал времени
в качестве примера пока истинно; do ./git.bash;sleep 20; done
эта строка автоматически отправляет мой код в GitHub каждые 20 секунд
Даже вы можете использовать эту команду, чтобы повторить свою команду 10 раз или больше, когда она сделана
для i в {1..10}; Сделайте Ваша команда ; сделано
, например:
для i в {1..10}; Сделайте Speedtest ; Сделано