Есть встроенная команда Unix repeat
, первым аргументом которой является количество повторений команды, где команда (с любыми аргументами) определяется оставшимися аргументами repeat
.
Например,
% repeat 100 echo "I will not automate this punishment."
повторяет данную строку 100 раз и затем останавливается.
Я хотел бы подобную команду - давайте назовем ее forever
- которая работает аналогично, за исключением того, что первый аргумент - это количество секунд для паузы между повторениями, и это повторяется навсегда. Например,
% forever 5 echo "This will get echoed every 5 seconds forever and ever."
Я думал, что спрошу, существует ли такая вещь, прежде чем я напишу это. Я знаю, что это как двухстрочный скрипт на Perl или Python, но, возможно, есть более стандартный способ сделать это. Если нет, не стесняйтесь опубликовать решение на вашем любимом языке сценариев, стиле Rosetta Stone .
PS: Возможно, лучшим способом сделать это было бы обобщение, repeat
чтобы взять как количество повторений (с -1 означает бесконечность), так и количество секунд для сна между повторениями. Приведенные выше примеры станут:
% repeat 100 0 echo "I will not automate this punishment."
% repeat -1 5 echo "This will get echoed every 5 seconds forever."
источник
type repeat
и дайте мне знать, откуда приходит?repeat
встроенная команда в csh и tcshОтветы:
Попробуйте
watch
команду.Так что:
будет выполнить команду каждый второй (ну, технически, каждый второй плюс время, необходимое для
command
бежать какwatch
(по крайней мере,procps
иbusybox
реализации) просто спит одна секунда между двумя отрезкамиcommand
), навсегда.Если вы хотите передать команду
exec
вместоsh -c
, используйте-x
опцию:На macOS вы можете получить
watch
из Mac Ports :Или вы можете получить его от Homebrew :
источник
while true; do X; sleep Y; done
- это намного лучше.cmdwatch
во FreeBSD (из портов:)sysutils/cmdwatch
.удар
while
+sleep
:Вот то же самое, что сокращенная однострочная (из комментариев ниже):
Использует
;
для разделения команд и используетsleep 1
дляwhile
теста, так как он всегда возвращает true. Вы можете поместить больше команд в цикл - просто разделите их с помощью;
источник
sleep
не всегда возвращаете правду. Ī̲ использовал такие циклы (хотя и с более длительной задержкой) именно потому, что есть способ изящно завершить его, убив процесс сна.Это просто более короткая версия других
while+sleep
ответов, если вы выполняете такие задачи часто, как свою повседневную жизнь, использование этого избавляет вас от ненужных нажатий клавиш, и если ваша командная строка начинает становиться длиннее, ее понимание будет немного проще. Но этот начинается со сна в первую очередь.Это обычно полезно, если вам нужно следить за чем-то, что выводится в одну строку, например, с загрузкой машины:
источник
while clear; do date; command;sleep 5; done
while sleep
комбинацию, экономит нажатия клавиш!Одна из проблем, которые есть во всех ответах, опубликованных до сих пор, заключается в том, что время выполнения команды может измениться. Например, если вы выполняете
sleep 10
команды между командами, а выполнение команды занимает 2 секунды, то она будет выполняться каждые 12 секунд; если для запуска требуется переменное количество времени, то в течение длительного времени время его выполнения может быть непредсказуемым.Это может быть именно то, что вы хотите; если это так, используйте одно из других решений или используйте это, но упростите
sleep
вызов.Для разрешения в одну минуту задания cron будут выполняться в указанное время, независимо от того, сколько времени занимает каждая команда. (На самом деле новое задание cron будет запущено, даже если предыдущее еще выполняется.)
Вот простой Perl-скрипт, который спит до следующего интервала, поэтому, например, с интервалом в 10 секунд команда может выполняться в 12:34:00, 12:34:10, 12:34:20 и т. Д., Даже если Сама команда занимает несколько секунд. Если команда выполняется более
interval
секунд, следующий интервал будет пропущен (в отличие от cron). Интервал вычисляется относительно эпохи, поэтому интервал 86400 секунд (1 день) будет выполняться в полночь по UTC.источник
while :; do sleep 1m & command; wait; done
wait
будут ждать их всех). Это поправимо путем измененияwait
вwait $!
, где$!
это PID отsleep
процесса. Опубликуйте это как ответ, и я проголосую за это. Но это действительно производит некоторый посторонний вывод в интерактивной оболочке.Я думаю, что все ответы здесь либо слишком запутаны, либо вместо этого отвечают на другой вопрос:
Настоящий вопрос был:
Это две совершенно разные вещи, когда команде требуется время, чтобы закончить.
Возьмем, к примеру, сценарий
foo.sh
(представьте, что это программа, выполнение которой занимает несколько секунд).Вы хотите запускать это каждую секунду, и большинство предложит
watch -n1 ./foo.sh
, илиwhile sleep 1; do ./foo.sh; done
. Тем не менее, это дает вывод:Который точно не запускается каждую секунду. Даже с
-p
флажком, какman watch
предлагает страница, может решить эту проблему, результат тот же.Простой способ выполнить желаемую задачу, к которой некоторые прикасаются, - запустить команду в фоновом режиме. Другими словами:
И это все, что нужно сделать.
Вы можете запускать его каждые 500 мс
sleep 0.5
, или что у вас есть.источник
while :; do sleep 1 & ./foo.sh; wait; done
date +"%H:%M:%S.%N"
в foo.sh, чтобы увидеть, как доля будет медленно увеличиваться в каждом цикле.В
bash
:(
echo
можно заменить любой командой ...Или в
perl
:Где
print "I will not automate this punishment in absurdum.\n"
можно заменить на «любую» команду, заключенную в обратные кавычки (`).И для паузы добавьте
sleep
оператор внутри цикла for:а также
источник
while [ 0 ]
плохой способ написать это. Это означает0
, что строка с длиной> 0.while [ 1 ]
илиwhile [ jeff ]
будет делать то же самое. Лучше написатьwhile true
.while :
Недавний bash> = 4.2 под последним ядром Linux, основанный ответ.
Для того, чтобы ограничить время выполнения, нет вилок ! Используются только встроенные.
Для этого я использую
read
встроенную функцию вместоsleep
. К сожалению, это не будет работать с нотными сессиями.Функция быстрого запуска "
repeat
" по запросу:Небольшой тест с цитируемыми строками:
В зависимости от степени детализации и продолжительности поданной команды ...
Под последними ядрами Linux существует профайл,
/proc/timer_list
содержащий информацию о времени в наносекундах.Если вы хотите выполнить команду ровно один раз в секунду, ваша команда должна завершиться менее чем за секунду! И оттуда вам остаётся
sleep
только остаток текущей секунды.Если задержка важнее и ваша команда не требует значительного времени, вы можете:
Но если ваша цель - получить более тонкую гранулярность, вам необходимо:
Используйте информацию наносекунд, чтобы подождать до начала секунды ...
Для этого я написал небольшую функцию bash:
Получив их, вы можете:
запустить
${command[@]}
непосредственно в командной строке, чем сравнить сэто должно дать точно такой же результат.
Нанимает функцию bash "
repeat
" по запросу:Вы можете получить это:
Тогда попробуйте это:
источник
read -t
это встроенный , покаsleep
нет. Это может иметь граничный эффект (т. Е. Нажатие клавиши [key: return] прерывает сон ), но это можно исправить путем тестирования$foo
Хочешь попробовать это (Баш)?
источник
repeat
специфично для csh и tcsh.Perl
источник
Bash и некоторые из его родственных оболочек имеют удобное
(( ... ))
обозначение, в котором могут быть вычислены арифметические выражения.Таким образом, в качестве ответа на ваш третий вызов, где и число повторов, и задержка между повторениями должны быть настраиваемыми, вот один из способов сделать это:
Этот ответ также страдает от смещения времени, описанного в ответе Кейта .
источник
Как упомянуто gbrandt, если
watch
команда доступна, обязательно используйте ее. Однако в некоторых системах Unix она не установлена по умолчанию (по крайней мере, там, где я работаю).Вот еще одно решение с немного отличающимся синтаксисом и выводом (работает в BASH и SH):
Изменить: я удалил некоторые "." в последнем эхо-заявлении ... пережиток моих дней Perl;)
источник
while [ 1 ]
работает только потому, что 1 рассматривается как строка, как иwhile [ -n 1 ]
.while [ 0 ]
илиwhile [ jeff ]
сделал бы то же самое.while true
имеет гораздо больше смысла.Если вы не хотите отображать сообщение на экране и можете позволить себе повторить работу в течение нескольких минут , возможно, crontab будет вашим лучшим инструментом. Например, если вы хотите выполнять свою команду каждую минуту, вы должны написать что-то вроде этого в вашем
crontab
файле:Пожалуйста, ознакомьтесь с руководством для дальнейшего примера. Кроме того, вы можете легко установить время с помощью Crontab Code Generator .
источник
Что если бы у нас были оба?
Вот идея: только с «интервалом», это повторяется навсегда. С «интервалом» и «разом» он повторяет это количество раз, разделенное «интервалом».
Использование :
Итак, алгоритм будет:
Следовательно :
источник
sleep
принимает их.Я закончил, создавая вариант ответа swalog. С его вы должны были ждать X секунд для первой итерации, я также запускаю мой на переднем плане, так что ..
источник
Быстро, грязно и, вероятно, опасно для загрузки, но если вы любите приключения и знаете, что делаете, вставьте это в
repeat.sh
иchmod 755
это,Вызвать его с
./repeat.sh <command> <interval>
Мое чувство пауков говорит, что это, вероятно, злой способ сделать это, верно ли мое чувство пауков?
источник
sleep $1; shift; "$@"
или подобное было бы намного лучше.Вы можете запустить скрипт из init (добавив строку в / etc / inittab). Этот скрипт должен выполнить вашу команду, подождать, пока вы не захотите снова запустить скрипт, и выйти из него. Init снова запустит ваш скрипт после выхода.
источник
Простой способ повторить задание из crontab с интервалом менее одной минуты (пример 20 секунд):
crontab: * * * * * script.sh
script.sh:
источник
Вы можете получить мощность от интерпретатора Python из оболочки.
замените пять в любое время (сек), которое вам нравится.
Внимание: для возврата используйте SHIFT + ENTER для возврата ввода в оболочке. И не забудьте ввести 4 пробела отступа в каждой строке цикла.
источник
python
«sos.system()
запускает оболочку интерпретировать командную строку, поэтому применениеpython
для запуска снарядов в цикле запустить команду периодически немного избыточна. Вы могли бы также сделать все в оболочке.Это решение работает в MacOSX 10.7. Это работает чудесно.
В моем случае
или же
убирать мой рабочий стол постоянно.
источник
sleep
команду?while [ 0 ]
странный способ написать бесконечный цикл; это работает, потому чтоtest
команда (также известная как[
) обрабатывает непустую строку как истину.while : ; do ... ; done
является более идиоматическим, или, если вы предпочитаете, вы можете использоватьwhile true ; do ... ; done
.Вы можете получить эту рекурсивную функцию:
или добавьте:
и вызвать скрипт.
источник
Чтобы повторно запустить команду в окне консоли, я обычно запускаю что-то вроде этого:
while true; do (run command here); done
Это также работает для нескольких команд, например, для отображения постоянно обновляемых часов в окне консоли:
while true; do clear; date; sleep 1; done
источник
источник
С
zsh
иsleep
реализация, которая принимает аргументы с плавающей точкой:Или для
forever
:Если ваш
sleep
не поддерживает поплавки, вы всегда можете переопределить его как обертка вокругzsh
«ыzselect
встроено:источник
... Интересно, сколько сложных решений можно создать при решении этой проблемы.
Это может быть так просто ...
поместите туда 1 следующую строку в конец файла, например:
Если вы хотите что-то запускать каждую секунду, просто добавьте туда:
и внутри этого файла .sh должно быть:
и это все!
НАСЛАЖДАТЬСЯ!
источник
работает для меня.
источник