web-dev-qa-db-fra.com

Démoniser un exécutable en ansible

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.

21
user3364247

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
17
Karel Jakubec

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 &

http://en.wikipedia.org/wiki/Nohup

12
udondan

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.

5
PhillipHolmes

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
2
nelsonenzo

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.

0
Kritonas