Многие задачи автоматизации до сих пор решают через бесконечные циклы:
while true; do
if [ -f /tmp/reload ]; then
systemctl restart myapp
rm /tmp/reload
fi
sleep 5
done
Работает, но процесс постоянно висит в памяти и каждые несколько секунд проверяет состояние файловой системы.▪️ Что есть лучше
В systemd существует специальный тип юнитов —
.path.Он использует inotify и реагирует на реальные изменения файлов или директорий, а не занимается постоянным опросом.
Пример: нужно перезапускать сервис после изменения конфигурации.
Создаем path-юнит:
[Path]
PathModified=/etc/myapp/config.yml
[Install]
WantedBy=multi-user.target
И связанный сервис:
[Service]
Type=oneshot
ExecStart=/bin/systemctl restart myapp.service
Активируем:
systemctl daemon-reload
systemctl enable --now myapp.path
Теперь изменение файла автоматически вызовет запуск сервиса.▪️ Что умеет отслеживать
Не только изменение файла:
PathExists=/tmp/file
PathChanged=/var/log/app.log
DirectoryNotEmpty=/var/spool/tasks
Например, можно запускать обработчик сразу после появления нового файла в директории или при заполнении очереди задач.▪️ Почему это удобно
Вместо собственных демонов, cron и циклов с
sleep получаем событийную модель: пока ничего не происходит - не расходуются ресурсы. Как только происходит нужное событие - systemd запускает действие.BashTex 📱 #bash