Назад | Перейти на главную страницу

Как перезапустить службу systemd, если файл не изменялся в течение определенного периода времени?

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

Я пробовал использовать дорожка unit, но он может запускать команду только при изменении отслеживаемого файла, а не наоборот.

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

Хотя ответ на комментарий действительно поднимает хороший вопрос о том, на чем следует сосредоточить свою энергию при решении такой проблемы (отладить и попытаться определить, почему он может зависать?), Возможным решением вашего вопроса может быть настройка а systemd-timer который запускается с любым интервалом, с которым вы хотите проверить этот файл, и запускать скрипт, который выполняет ваши тесты и действия. Может быть, что-то вроде (если вы используете 1 час в качестве интервала):

Таймер

[~]# cat /etc/systemd/system/checkhung.timer 
[Unit]
Description=Check if file not modified in a while and restart service

[Timer]
OnActiveSec=60min
OnUnitActiveSec=60min

обслуживание

[~]# cat /etc/systemd/system/checkhung.service 
[Unit]
Description=Check if file not modified in a while and restart service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/checker.sh

Сценарий

[~]# cat /usr/local/bin/checker.sh
#!/bin/bash

if [[ $(find /path/to/the/file.txt -mmin +60) ]]
then
    /usr/bin/systemctl restart my-service.service
fi

Обратите внимание, что я не тестировал это, поэтому может потребоваться некоторая настройка.