J'essaie de créer une tâche dans ansible qui exécute une commande Shell pour exécuter un exécutable en mode démon en utilisant &. Quelque chose comme suivre
-name: Start daemon
Shell: myexeprogram arg1 arg2 &
Ce que je vois, c'est si je garde et que la tâche revient immédiatement et que le processus n'est pas démarré. Si je supprime la tâche & ansible attend un certain temps sans revenir.
Appréciez la suggestion sur la bonne façon de démarrer le programme en mode démon via ansible. Veuillez noter que je ne veux pas l'exécuter en tant que service, mais un processus d'arrière-plan adhoc basé sur certaines conditions.
L'exécution du programme avec '&' ne fait pas du programme un démon, il s'exécute simplement en arrière-plan. Pour créer un "vrai démon", votre programme doit suivre les étapes décrites ici .
Si votre programme est écrit en C, vous pouvez appeler la fonction daemon (), qui le fera pour vous. Ensuite, vous pouvez démarrer votre programme même sans "&" à la fin et il s'exécutera en tant que démon.
L'autre option est d'appeler votre programme en utilisant daemon , qui devrait également faire le travail.
- name: Start daemon
Shell: daemon -- myexeprogram arg1 arg2
Lorsque vous (ou Ansible) vous déconnectez, le signal de sortie sera toujours envoyé au processus en cours, même s'il s'exécute en arrière-plan.
Vous pouvez utiliser Nohup
pour contourner cela.
- name: Start daemon
Shell: Nohup myexeprogram arg1 arg2 &
D'après la brève description de ce que vous souhaitez réaliser, il semble qu'il serait préférable pour vous de configurer votre exécutable en tant que service (à l'aide d'Upstart ou similaire), puis de le démarrer/l'arrêter si nécessaire en fonction des autres conditions qui le nécessitent. être en cours d'exécution (ou ne pas fonctionner).
Si vous essayez de l'exécuter en tant que processus, vous devrez sinon capturer le PID ou similaire afin que vous puissiez essayer d'arrêter le démon que vous avez démarré lorsque vous en avez besoin, avec à peu près la même complexité que l'installation d'un fichier de configuration init. et sans les subtilités que des systèmes comme Upstart vous offrent avec les commandes telles que start/stop.
J'ai trouvé que la meilleure façon, notamment parce que je voulais que la sortie soit enregistrée, était d'utiliser le paquet "daemonize". Si vous êtes sur CentOS/Redhat, comme ci-dessous. Il y a probablement aussi un apt-package pour cela.
- name: yum install daemonize
yum:
name: daemonize
state: latest
- name: run in background, log errors and standout to file
Shell: daemonize -e /var/log/myprocess.log -o /var/log/myprocess.log /opt/myscripts/myprocess.sh
En ajoutant aux suggestions daemonize ci-dessus, si vous voulez démarrer votre programme dans un répertoire spécifique, vous pouvez faire:
- name: install daemonize package
package:
name: daemonize
state: latest
- name: start program
command: daemonize -c /folder/to/run/in /path/to/myexeprogram arg1 arg2
En particulier, vous souhaitez probablement que les indicateurs -e -o enregistrent la sortie.