web-dev-qa-db-fra.com

Redémarrage automatique du script rc.local en cas de plantage

J'ai rc.local en train de charger un script au démarrage. Vous vous demandez si ce service plante, y a-t-il un moyen de le redémarrer automatiquement?

1
Zanden

Au lieu d'utiliser /etc/rc.local pour les services de longue durée, créez n service systemd . Par exemple, créez /etc/systemd/system/foo.service, contenant:

[Unit]
Description=Foo

[Service]
Type=simple
ExecStart=/usr/bin/sleep 10
Restart=always

[Install]
WantedBy=default.target

Cela crée un service qui redémarrera la commande à sa mort. Remplacez ExecStart par votre commande.

Après avoir créé ce fichier, faites:

Sudo systemctl daemon-reload
Sudo systemctl enable foo.service
Sudo systemctl start foo.service

La première commande indiquera à systemctl de rechercher de nouvelles définitions de service. La seconde active le service en fonction des conditions de démarrage dont il dispose (dans ce cas, commencer par le default.target, afin qu’il démarre au démarrage). La dernière commande démarre le service pour cette session .


Pour Type:

Si défini sur simple (valeur par défaut si ni Type= ni BusName=, mais ExecStart= sont spécifiés), le processus configuré avec ExecStart= est censé être le processus principal du service. Dans ce mode, si le processus offre des fonctionnalités à d'autres processus du système, ses canaux de communication doivent être installés avant le démarrage du démon (par exemple, les sockets configurés par systemd, via l'activation de socket), car systemd procédera immédiatement au suivi. unités.

Si défini sur forking, il est prévu que le processus configuré avec ExecStart= appelle la fonction fork() dans le cadre de son démarrage. Le processus parent est censé se terminer lorsque le démarrage est terminé et que tous les canaux de communication sont configurés. L'enfant continue de s'exécuter en tant que processus démon principal. C'est le comportement des démons UNIX traditionnels. Si ce paramètre est utilisé, il est recommandé d'utiliser également l'option PIDFile=, afin que systemd puisse identifier le processus principal du démon. systemd commencera par les unités de suivi dès que le processus parent sera terminé.

Donc, si votre commande vous demande, utilisez Type=forking et définissez PIDFile si vous le pouvez.


Pour WantedBy, exécutez systemctl list-units | grep target pour rechercher d'autres cibles disponibles que vous pouvez utiliser pour un contrôle plus détaillé.

3
muru