Я хотел бы, чтобы сценарий (bash) выполнялся один или два раза в секунду в фоновом режиме. Я вижу два возможных решения:
Итак, мои вопросы:
«Один или два раза в секунду» - это достаточно часто, чтобы я выбрал вариант цикла, но давайте рассмотрим некоторые различия.
Сценарий с циклом потребляет небольшое количество ресурсов (занимает один PID, код, загруженный в память (хотя, возможно, выгруженный) и т. Д.), Даже когда он ничего не делает. Стоимость таймера systemd ниже, я думаю, в основном один таймер.
sleep
обрабатывает все время. (Если только sleep
встроен в вашу оболочку, но не в Bash.)Таймер каждый раз оплачивает стоимость запуска программы. Эта стоимость зависит от программы (например, для Java-программы она будет значительной, отбрасывая результаты оптимизации каждый раз, когда программа заканчивается; для сценария оболочки это, вероятно, менее серьезно).
Таймер заставит соответствующую службу регистрироваться в журнале каждый раз при запуске и остановке. (На мой взгляд, это основная причина не выбирать таймер в вашем сценарии. Несколько сообщений в секунду - это большой спам.)
Запуск нового экземпляра службы каждый раз по истечении таймера дает вам отдельный учет ресурсов для каждого экземпляра (см. systemd.resource-контроль (5)). Если e. грамм. по какой-то причине ваша служба потребляла гораздо больше дисковых операций ввода-вывода в час ночи, это будет записано в журнал для последующего анализа, если вы включите учет (это часть сообщения журнала: «Потреблено Икс Процессорное время, читать y с диска »и др.).
Таймеры systemd по умолчанию имеют точность всего одну минуту, что позволяет запускать несколько таймеров одновременно, что снижает вероятность пробуждения ЦП. Это можно изменить (например, AccuracySec=1us
, видеть systemd.timer (5)), но это может быть признаком того, что посекундная активация таймера выходит за рамки наиболее типичного варианта использования.
Таймер systemd позволяет вам удобно видеть, когда он последний раз истек, и когда он снова истечет по расписанию, используя systemctl list-timers
. Самодельная петля для сна, вероятно, не дает такого же уровня понимания.
При использовании таймера изменения службы вступают в силу при следующем срабатывании таймера. Если у службы есть собственный цикл, ее необходимо перезапустить, чтобы изменения вступили в силу.
Я не знаю многих других альтернатив. Достопочтенный cron (в любой реализации, которую вы используете), вероятно, имеет некоторые из тех же преимуществ, что и таймеры systemd (например, более низкая стоимость бездействия), а также некоторые из тех же недостатков (например, более высокая стоимость запуска).