Comment exécuter un programme en tant que service (silencieux)?


23

J'ai un serveur basé sur python que je démarre à partir du terminal. Cette instance particulière du terminal donne alors le contrôle au programme, et le programme l'utilise comme une sorte de fenêtre de journalisation, jusqu'à sa fermeture. Est-ce normal, ou devrais-je essayer de démarrer le programme d'une autre manière pour qu'il apparaisse simplement comme un processus actif? Si je ferme le terminal à partir duquel j'ai démarré le programme, le programme meurt avec lui.

Merci


PHP est mentionné dans cette réponse mais il s'applique également à Python: askubuntu.com/questions/26555/running-php-cli-server/…

Réponses:


9

Même l'ancien bash utilise & pour envoyer des processus en arrière-plan, mais il y a aussi quelques autres façons .. mais les deux de base sont les suivantes:

1.)$~ your_command > outputfile_for_stdout &
        # runs your command in background, giving you only PID so you can exit that process by `kill -9 PID_of_process`
        # & goes at the end of row      


2.)$~ your_command > outputfile_for_stdout 
        # this will run your program normally
        # press  Ctrl + Z then program will pause
   $~ bg
        # now your program is running in background
   $~ fg
        # now your program came back to foreground
3.)you can run terminal window under screen command so it will live until you either kill it or you reboot your machine
   $~ screen
   $~ run_all_your_commands
       # Ctrl + A + D will then detach this screen
   $~ screen -r will reattach it

Quelques autres commandes utiles:

   $~ jobs
        # will show you all processes running right now, but without PID
   $~ ps
        # will show you all processes for actual terminal window


Excellente solution. Est-il possible de modifier l'option 1. afin que le pid soit enregistré dans un fichier. Un fichier journal et un fichier pid sont donc générés.
Oguz Bilgic

27

Transformez-le en démon (service)
daemon --name="yourservicename" --output=log.txt sh yourscript.sh


7
$ servicename &

L'utilisation &entraîne l'exécution du programme en arrière-plan, au lieu de bloquer le shell jusqu'à la fin du programme.


Non, non. Par exemple. dixon@dixon-vaio:~$ nautilus & [1] 11835. Il retourne l'identifiant du processus et vous obtiendrez une nouvelle invite shell. Vérifiez également ceci: http://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and .
dixoncx

1
Je me suis trompé. Le vote négatif a été supprimé.
Scott Severance


0

Depuis le terminal, vous pouvez également exécuter screen ou suivre votre commande avec &. Un moyen facile d'exécuter des processus continus.


il suffit &, à mon avis, de simplement utiliser le processus dans ce cas. OP déclare que son serveur se connecte à stdout donc, avec &son terminal sera encombré de sortie. De plus, étant donné que OP mentionne la fermeture du terminal , OP ne pourra plus mettre en avant le processus et toutes les sorties de journal seront perdues. Mieux, au moins, pour le rediriger vers un fichier journal ou s'en tenir à la screenconfiguration - mais alors expliquez les bases de screenOP (detach / attach / etc)
Robert Riedl
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.