web-dev-qa-db-fra.com

Lorsque je lance manuellement mon propre service, celui-ci est au premier plan, est-ce correct?

J'ai créé mon propre service par:

  1. copier mon binaire sur /usr/bin/mcp
  2. Créez un démon en copiant le squelette: /etc/init.d/skeleton
  3. Modifiez le script skeleton bash en haut:

    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="Runs my Service"
    NAME=mcp
    DAEMON=/usr/bin/$NAME
    DAEMON_ARGS="-d f -c /etc/mcp"
    PIDFILE=/var/run/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME
    

    Autre que cela, le squelette est exactement le même.

  4. Ensuite, je crée le démon:

    Sudo update-rc.d -f mcp remove
    Sudo update-rc.d mcp defaults 97 03
    

Lorsque j'exécute le programme manuellement: mcp -d f -c /etc/mcp, cela fonctionne, mais il ne retourne jamais car c'est un service qui doit toujours être exécuté. C'est normal.

Mais maintenant, quand je le lance en tant que service: Sudo service mcp start, je constate le même comportement. C'est à dire. dès que j'entre dans la commande de service de démarrage, le programme s'exécute, mais maintenant mon terminal est bloqué dans l'attente du programme.

Je pensais que si vous exécutez quelque chose en tant que service, il devrait être exécuté en arrière-plan?

De plus, je ne peux pas arrêter ce service à moins d’ouvrir un deuxième terminal. Je le veux plutôt pour que, lorsque je démarre le service, il commence quelque part en arrière-plan, puis vous revenez à la ligne de commande. Est-ce que je fais quelque chose de mal ici?

3
code_fodder

N'utilisez pas un service init.d. Écrivez un travail Upstart à la place. Voici un exemple . Upstart se chargera de garder le programme en arrière-plan, de se connecter, etc.

Votre service serait dans /etc/init/mcp.conf, contenant par exemple:

start on runlevel [2345]
stop  on runlevel [016]

exec /usr/bin/mcp -d f -c /etc/mcp

Ensuite, vous pouvez faire:

Sudo service mcp start
Sudo service mcp stop

Etc.

2
muru