Forking dans un script systemd

10

Je veux que le service systemd gère les fourches (mon fichier ne gère pas les fourches par lui-même. Je compte donc sur systemd pour gérer cela)

Mon fichier .service:

[Unit]
Description=swamp services management service
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/swamp

[Install]
WantedBy=multi-user.target

Question

Les spécifications sont-elles Type=forkingsuffisantes pour ce que j'essaie de réaliser? Ou est-il similaire de s'attendre à forking dans upstart qui indique réellement à upstart (si je comprends bien, je ne suis pas sûr de le faire, je suis nouveau dans l'écriture de scripts) que mon service gérerait le forking / démonétisation.

alonisser
la source

Réponses:

16

systemd a une excellente documentation. Voir la page sur les fichiers de service :

S'il est défini sur forking, le processus configuré avec ExecStart = appellera fork () dans le cadre de son démarrage. Le processus parent devrait 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 procédera au démarrage des unités de suivi dès la fin du processus parent.

Donc, utiliser cela typeindiquera simplement à systemd d'attendre les swampretours et de le considérer comme étant toujours en cours d'exécution: faire en sorte que cela se produise reste votre responsabilité ...

jasonwryan
la source
5
Si le script ne fait pas de bifurcation, c'est soit oneshot(un script court typique) ou simple(un service de longue durée qui ne débouche pas + quitte).
Pavel Šimerda
4
Envisageriez-vous un script (Bash?) Pour bifurquer un autre processus lorsqu'il se déroule en esperluette &?
Felipe Alvarez
5
@FelipeAlvarez yes, l'opérateur esperluette dans bash est équivalent à fork et exec.
Thayne
1

Si vous voulez que systemd gère les fourches, vous devez utiliser par exemple Type=simpleou Type=notify. Ensuite, systemd fera le fork pour vous.

Si vous pouvez modifier l' swampexécutable, Type=notifyc'est la meilleure solution. L'exécutable devrait alors informer systemd quand il est correctement initialisé. Cela signifie qu'il systemctl start swampattendra que le marais s'initialise lorsqu'il est appelé à partir de la ligne de commande et qu'il imprime tout message d'erreur lors de l'initialisation sur la ligne de commande, ce qui est généralement le cas.

Pour un exemple d'exécutable écrit pour utiliser Type = notify, consultez le shellscript suivant:

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000
user3049102
la source