Vous pouvez et c'est assez facile. RPi dispose d'un module Linux qui implémente l'API de surveillance Linux standard. Vous pouvez trouver la documentation de ceci ici .
Maintenant, si vous lisez ceci, vous saurez qu'il y a un fichier de périphérique spécial appelé /dev/watchdog
et pour l'utiliser, watchdog
vous devez ouvrir ce fichier et écrire des données (un octet, il est préférable d'écrire autre chose que 'V' que je ' m expliquant plus tard) de temps en temps. Si vous n'écrivez rien dans ce fichier assez longtemps, watchdog
un redémarrage sera déclenché. Vous pouvez trouver un exemple de programme (très simple) ici .
Notez que dans une situation normale, si vous fermez /dev/watchdog
, watchdog
peut être désactivé. Il existe un mode spécial appelé «fonctionnalité Magic Close» qui semble être implémenté par un pilote RPi mais AFAIK il n'est pas activé dans la configuration par défaut du noyau (option CONFIG_WATCHDOG_NOWAYOUT). Dans ce cas, le redémarrage sera déclenché même si vous fermez, /dev/watchdog
sauf si vous y écrivez «V» juste avant de quitter l'application.
Vous devriez vous tester si elle est effectivement désactivée (je n'ai pas de RPi ici pour le tester), mais si ce n'est pas le cas, ce n'est pas bon pour vous. Si votre application plante, le fichier du périphérique de surveillance sera fermé et le redémarrage ne sera pas déclenché et c'est pourquoi vous le souhaitez. Dans cette situation, vous pouvez soit modifier la configuration du noyau et la reconstruire, soit écrire une application personnalisée qui va surveiller si votre application principale fonctionne (en utilisant une méthode IPC par exemple).
Il y a aussi l'API ioctl qui vous permet d'en faire plus avec watchdog
. Vous pouvez, par exemple, définir un délai d'expiration différent - IOCTL avec WDIOC_SETTIMEOUT (semble être pris en charge par le pilote RPI) ou obtenir un délai d'expiration - IOCTL avec WDIOC_GETTIMEOUT (qui semble également être pris en charge). Vous souhaiterez peut-être l'utiliser pour modifier le délai d'expiration par défaut (10 secondes). Il y a cependant une limite stricte à 16 secondes. Voici un exemple:
int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
Vous pouvez également utiliser IOCTL avec WDIOC_KEEPALIVE au lieu d'écrire un caractère si vous le souhaitez. Les deux méthodes sont valides.