Якщо ви, як і багато системних адміністраторів, шанувальник сценаріїв cron, які запускаються за допомогою * * * * * /I/launch/my/script.sh, ця стаття повинна змусити вас подумати про інший спосіб зробити це використовуючи всю потужність і легкість, які пропонує systemd.
Ми напишемо сценарій python, який забезпечить безперервний цикл для виконання дій, які ви визначаєте.
Ми побачимо, як запустити цей сценарій як службу systemd, переглянемо журнали в journalctl і побачимо, що станеться, якщо сценарій аварійно завершує роботу.
"""
Sample script to run as script
"""
import time
import logging
import sys
from systemd.journal import JournaldLogHandler
# Get an instance of the logger
LOGGER = logging.getLogger(__name__)
# Instantiate the JournaldLogHandler to hook into systemd
JOURNALD_HANDLER = JournaldLogHandler()
JOURNALD_HANDLER.setFormatter(logging.Formatter(
'[%(levelname)s] %(message)s'
))
# Add the journald handler to the current logger
LOGGER.addHandler(JOURNALD_HANDLER)
LOGGER.setLevel(logging.INFO)
class Service(): # pylint: disable=too-few-public-methods
"""
Launch an infinite loop
"""
def __init__(self):
duration = 0
while True:
time.sleep(60)
duration += 60
LOGGER.info("Total duration: %s", str(duration))
# will failed after 4 minutes
if duration > 240:
sys.exit(1)
if __name__ == '__main__':
LOGGER.info("Starting the service")
Service()
Ми починаємо з створення екземплярів необхідних змінних для надсилання логів у journald. Потім скрипт запускає нескінченний цикл і робить паузу на 60 секунд (що є мінімумом для виконання cron, тому ми можемо опуститися нижче цього обмеження).
Примітка
Особисто я використовую цей сценарій у більш просунутій формі, який постійно надсилає запити до бази даних і виконує завдання на основі інформації, отриманої через API rundeck
systemd і journald надають нам інструменти для створення надійних і потужних сценаріїв, які достатньо легко замінять наші старі надійні сценарії crontab.