Ma configuration a un service systemd qui devrait périodiquement écrire dans un fichier. Je voudrais surveiller le fichier pour les modifications, donc quand il n'a pas été modifié pendant un certain temps, je sais que le service a buggé. J'aimerais pouvoir redémarrer automatiquement le service lorsque cela se produit.

J'ai essayé d'utiliser le fichier d'unité de chemin , mais il ne peut démarrer une commande que lorsque le fichier surveillé est modifié, et non l'inverse.

La question inverse a été posée, où le service doit être redémarré lorsqu'un fichier a été modifié, mais la solution ne semble pas être directement applicable à ma situation.

answer

Bien que la réponse au commentaire soulève un bon point sur l'endroit où l'on devrait concentrer son énergie lorsqu'il s'agit d'un problème comme celui-ci (déboguer et essayer de déterminer pourquoi cela pourrait se bloquer ?), une solution possible à votre question pourrait être de configurer un timer systemd qui se déclenche à n'importe quel intervalle que vous cherchez à vérifier ce fichier, et qui exécute un script qui effectue vos tests et actions. Peut-être quelque chose comme (si vous utilisez 1h comme intervalle) :

Minuteur

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

[Timer]
OnActiveSec=60min
OnUnitActiveSec=60min

Service

[~]# 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

Scénario

[~]# 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

Notez que je n'ai pas testé cela, donc quelques ajustements peuvent être nécessaires.