Периодическое выполнение команды Linux

Обновлено: 02.07.2024

Я хочу запустить скрипт и запускать команду каждые x минут.

Кроме того, любые общие советы по любым ресурсам для изучения сценариев bash могут быть очень полезными. Я использую Linux для своей личной разработки, поэтому bash-скрипты мне не совсем чужды, просто я не писал свои собственные с нуля.


Что касается вашего запроса ресурсов, на вики bash-hackers есть ухоженный список ресурсов, который явно сокращен, чтобы избежать руководств, которые не заботятся о том, чтобы избежать классических ловушек.

8 ответов 8

Если вы хотите периодически запускать команду, есть 3 способа:

  • используя команду crontab ex. * * * * * команда (запускается каждую минуту)
  • используя цикл, например: while true; сделать ./my_script.sh; спать 60; сделано (не точно)
  • используя системный таймер

Некоторые советы по лучшим практикам написания сценариев bash:


Я не знаю вариантов лучше и хуже. Они оба имеют свои плюсы и минусы. Одним из недостатков подхода cron является то, что вы можете запускать несколько экземпляров команды одновременно. Этого не может быть в примере с циклом while переднего плана.

На самом деле зависит от того, что вы хотите сделать. цикл while выйдет из синхронизации (с чем угодно). Если вам нужно быть точным во времени, цикл не сработает (по крайней мере, не так просто).

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

В дополнение к ответу @sputnick есть еще часы. Со страницы руководства:

По умолчанию каждые 2 секунды. Например, watch полезен для отслеживания журналов.

Важно отметить, что часы не являются стандартными и не существуют в большинстве систем, отличных от GNU (включая Mac), по умолчанию.

Пользователи macOS: вот частичная реализация команды GNU watch (начиная с версии 0.3.0 ) для периодических интерактивных вызовов преимущественно для визуальных осмотр:

Он синтаксически совместим с версией GNU и выдает определенное сообщение об ошибке, если используется нереализованная функция.

  • Вывод не ограничивается одним экраном.
  • Отображение выходных различий не поддерживается.
  • Использование точного времени не поддерживается.
  • Цветной вывод всегда передается (подразумевается --color).

Также реализовано несколько нестандартных функций, таких как ожидание успеха ( -E ) в дополнение к ожиданию ошибки ( -e ) и отображение времени последнего вызова, а также общее время, прошедшее на данный момент.

Чтобы узнать подробности, запустите watch -h.

Исходный код (вставьте в файл сценария с именем watch , сделайте его исполняемым и поместите в каталог в $PATH ; обратите внимание, что подсветка синтаксиса здесь не работает, но код работает):

Если вам нужно визуально контролировать команду, которая выдает статический вывод, используйте команду watch [options] . Например, для мониторинга свободной памяти выполните:

где параметр -n 1 устанавливает интервал обновления в 1 секунду (по умолчанию 2 секунды).
Подробнее см. man watch или онлайн-руководство.

Если вам нужно визуально отслеживать изменения в файле журнала, вам подойдет команда tail, например:

где параметр -f (для «следить») указывает программе выводить добавляемые данные по мере роста файла.
Подробности см. в man tail или в онлайн-руководстве.

Я хочу выполнять скрипт и запускать команду каждый раз

Любой общий совет по любым ресурсам для изучения сценариев bash может быть действительно крутым. Я использую Linux для своей личной разработки, поэтому сценарии bash не совсем чужды мне, я просто не писал свои собственные с нуля.

Если вам удобно работать с bash, я рекомендую сначала прочитать справочную страницу bash ( man bash ) — там много интересного.

Как избежать смещения во времени

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

Это сдвинется не более чем на одну секунду. Затем он вернется синхронно с часами. Если вам нужно что-то с дрейфом менее 1 секунды, а ваша команда sleep поддерживает числа с плавающей запятой, попробуйте добавить наносекунды в расчет, как здесь

Это умно! Это фактически удаляет время выполнения команды. Однако его можно было бы улучшить.

Я бы реализовал следующее обновление. Это устраняет все накладные расходы, возникающие в результате вызова echo date и bc : t=$SECONDS; пока верно; выполнить команду; спать $(((t+=6) - СЕКУНДЫ)); Готово . Переменная SECONDS является внутренней переменной bash.Вы можете видеть, что дрейф минимален, если вы замените cmd на дату '+%FT%T.%6N'

@kvantour Отличный вклад! Ваше решение все еще продолжает дрейфовать на неопределенный срок. Но вы дали мне еще кое-что для размышления. Я обновил свое решение!

Вот мое решение, позволяющее уменьшить отклонение от времени выполнения полезной нагрузки цикла.

Есть некоторое приближение к объектному подходу таймера, когда команда sleep выполняется параллельно со всеми другими командами, включая даже true при проверке условия. Я думаю, что это самый точный вариант без определения дрейфа с помощью команды даты.

Возможна настоящая bash-функция объекта таймера, реализующая событие таймера простым вызовом 'echo', а затем передающаяся в цикл с помощью read cmd, например так:


Недавно я столкнулся с этой проблемой. Мне нужен был способ выполнять часть сценария каждый час в файле сценария bash, который запускается в crontab каждые 5 минут, без необходимости использовать сон или полностью полагаться на crontab. если TIME_INTERVAL не соблюдается, сценарий завершится ошибкой при первом условии. Если TIME_INTERVAL соблюдается, однако TIME_CONDITION не соблюдается, сценарий завершится ошибкой при втором условии. Приведенный ниже скрипт работает рука об руку с crontab — отрегулируйте в соответствии с ним.

ПРИМЕЧАНИЕ: коснитесь -m "$0" — это изменит отметку времени модификации файла сценария bash. Вам придется создать отдельный файл для хранения последнего времени выполнения скрипта, если вы не хотите изменять временную метку модификации файла скрипта bash.


Не тот ответ, который вы ищете? Просмотрите другие вопросы с тегами bash или задайте свой вопрос.

Связано

Связанные

Горячие вопросы о сети

Чтобы подписаться на этот RSS-канал, скопируйте и вставьте этот URL-адрес в программу для чтения RSS.

дизайн сайта / логотип © 2022 Stack Exchange Inc; вклады пользователей под лицензией cc by-sa. версия 2022.3.18.41718

Требование периодического запуска команды или процесса в Linux довольно распространено. От сценариев очистки до дублирующихся команд удаления файлов и автоматических периодических обновлений — все можно настроить для периодического запуска в Linux.

Обычно для этого нужно настроить задания Cron, которые удобны, когда речь идет о сценариях автоматизации и фоновых заданиях. Однако, если вам нужно периодически запускать команду или программу и просматривать ее вывод в интерактивном режиме, то есть в (почти) реальном времени; Cron использовать нельзя, так как он сохраняет все выходные данные в файлы журнала.

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

Основной синтаксис для использования команды watch:

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

Список запущенных Процессы Linux

Список запущенных процессов Linux

Приведенная выше команда будет вызывать «ps -ef» (используется для отображения запущенных процессов и использования ими ресурсов) каждые 2 секунды, чтобы мы могли регулярно видеть обновленные данные об использовании ресурсов.

Выполнять команду Linux каждую минуту

Чтобы указать временной интервал для периодического запуска, используйте параметр -n.

Например, чтобы запускать команду или программу Linux каждую минуту, используйте следующую команду.

Очевидно, что команда ps -ef будет запускаться каждую минуту.

 Выполнять команду Linux каждую минуту

Выполнять команду Linux каждую минуту

Еще одна интересная опция — это аргумент -d , который будет выделять разницу в выводе после каждого периодического запуска команды. Например, давайте снова запустим команду ps, на этот раз отсортировав вывод в порядке убывания использования памяти, чтобы мы могли легко увидеть выделенную разницу.

Найти самые запущенные процессы по использованию памяти

Найдите наиболее запущенные процессы по использованию памяти

Как видно выше, он выделил значения, которые изменились при текущем запуске команды ps. Обратите внимание, что это подчеркнет разницу только между двумя непосредственными запусками, а не между всеми запусками.

Заключение

Мы увидели, как простое использование команды watch позволяет нам периодически запускать программы в Linux. Команда watch имеет больше доступных опций, которые действительно помогают пользователю настроить свои периодические прогоны. Обязательно ознакомьтесь с ними на справочной странице.

Спасибо, что прочитали, и сообщите нам, какие программы вы использовали или будете использовать с Watch для просмотра вывода в реальном времени!

Часто вам нужно запускать команду каждые X секунд в Linux. Конечно, вы можете использовать cron, но, к сожалению, он не справляется с точностью до минуты.

Команда watch в Linux позволяет периодически запускать программу. По умолчанию команда watch имеет период повторения 2 секунды, но это можно изменить в соответствии с требованиями.

Допустим, вы хотите выполнить периодический поиск файла, который вы ожидаете получить с удаленного компьютера. Команда поиска будет выглядеть так:

найти /home/ -name «test_results.txt»

Теперь, чтобы выполнять эту задачу каждые две секунды, вы можете использовать команду watch следующим образом:

наблюдайте за поиском /home/ -name «test_results.txt»


команда просмотра Linux

После того как вы нажмете Enter, вы увидите:


Снимок выше показывает заголовок с информацией об интервале обновления вместе с выполняемой командой. Чтобы скрыть заголовок, используйте параметр -t.

Изменение временного интервала выполнения

Если вы хотите изменить период по умолчанию в 2 секунды на другое значение, вы можете использовать параметр -n с командой watch. Это укажет период в секундах.

Например, вы хотите запускать команду «free -m» каждые 5 секунд, вам просто нужно действовать следующим образом:


смотреть -n 5 бесплатно -m


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

смотреть -n 10 your_script.sh

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

Заключение

Вы видели, как использовать команду watch для выполнения повторяющихся задач. Вы также можете использовать цикл while или for вместе с командой sleep. Если у вас есть другие способы, сообщите нам об этом.

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

Амин Нади

Амин Нахди, начинающий инженер-программист и компьютерщик по натуре, а также заядлый пользователь Ubuntu и открытого исходного кода. Он интересуется информационными технологиями, особенно экосистемой на основе Linux, а также Windows и MacOS. Он любит делиться знаниями и распространять их среди других прозрачным и ответственным образом.

Существует встроенная команда Unix repeat, первый аргумент которой — количество повторений команды, где команда (с любыми аргументами) определяется остальными аргументами для повторения.

выводит указанную строку 100 раз, а затем останавливается.

Мне нужна аналогичная команда — давайте назовем ее навсегда — которая работает аналогично, за исключением того, что первый аргумент — это количество секунд для паузы между повторами, и она повторяется вечно. Например,

Я решил спросить, существует ли такая вещь, прежде чем писать. Я знаю, что это похоже на двухстрочный скрипт Perl или Python, но, возможно, есть более стандартный способ сделать это. Если нет, опубликуйте решение на своем любимом языке сценариев.

PS: Возможно, лучшим способом сделать это было бы обобщить повтор, чтобы взять как количество повторений (где -1 означает бесконечность), так и количество секунд для сна между повторами. Тогда приведенные выше примеры станут такими:


Круто. К сожалению, и в моей Ubuntu, и в моей AIX команда repeat is не найдена. Можете ли вы сделать повтор шрифта и сообщить мне, откуда он взялся?

Я также использую Ubuntu, и повторение не установлено. Любая информация о том, как установить это, будет полезна.

25 ответов 25

Попробуйте команду просмотра.

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

Если вы хотите передать команду exec вместо sh -c , используйте параметр -x:

В macOS вы можете получить часы из портов Mac:

Или вы можете получить его от Homebrew:


Проблема с этим инструментом (по крайней мере, в Ubuntu) заключается в том, что он вызывает полноэкранный режим, поэтому, если я выгружаю некоторую периодическую информацию, я теряю предыдущую информацию.

Баш

Это то же самое, что и сокращенная однострочная запись (из комментариев ниже):

Использует ; для разделения команд и использует сон 1 для теста while, поскольку он всегда возвращает true. Вы можете поместить в цикл больше команд — просто разделите их ;

@dreeves, используя ";" в качестве разделителя команды могут выполняться в одной строке. Посмотрите на ответ Туни в качестве примера

sleep 1 всегда возвращает true, поэтому его можно использовать в качестве условия while. Не самая читаемая вещь в мире, но абсолютно правильная: while sleep 1; сделать эхо "Привет"; готово

@David Costa: Вы сделали разумное замечание, но функция sleep не всегда возвращает значение true. Ī̲ использовал такие циклы (хотя и с большей задержкой) именно потому, что есть способ изящно завершить его, убив процесс сна.

@IncnisMrsi Я не думал об этом, на самом деле он возвращает ноль, только когда время истекло, и ненулевое значение, когда оно завершается сигналом. Спасибо, что указали на это

Это просто укороченная версия других ответов while+sleep, если вы часто выполняете такие задачи в своей повседневной жизни, использование этого избавляет вас от ненужных нажатий клавиш, и если ваша командная строка начинает становиться длиннее, понимая это одному немного легче. Но этот начинается со сна.

Обычно это полезно, если вам нужно следить за чем-то, что имеет однострочный вывод, например загрузку машины:

Одна проблема, связанная со всеми ответами, опубликованными до сих пор, заключается в том, что время выполнения команды может смещаться. Например, если вы выполняете sleep 10 между командами, а выполнение команды занимает 2 секунды, то она будет выполняться каждые 12 секунд; если для запуска требуется переменное количество времени, то в долгосрочной перспективе время его выполнения может быть непредсказуемым.

Возможно, это именно то, что вам нужно; если это так, используйте одно из других решений или используйте это, но упростите вызов сна.

При одноминутном разрешении задания cron будут выполняться в указанное время, независимо от того, сколько времени занимает каждая команда. (На самом деле новое задание cron запустится, даже если предыдущее все еще выполняется.)

Вот простой Perl-скрипт, который приостанавливается до следующего интервала, поэтому, например, с интервалом в 10 секунд команда может выполняться в 12:34:00, 12:34:10, 12:34:20 и т. д. даже если сама команда занимает несколько секунд. Если команда выполняется дольше интервала секунд, следующий интервал будет пропущен (в отличие от cron). Интервал вычисляется относительно эпохи, поэтому интервал в 86 400 секунд (1 день) будет отсчитываться в полночь по всемирному координированному времени.

Читайте также: