2009-09-23 7 views
23

J'ai suivi le tutoriel de base CherryPy (http://www.cherrypy.org/wiki/CherryPyTutorial). Une chose non discutée est le déploiement. Comment puis-je lancer une application CherryPy en tant que démon et «l'oublier»? Que se passe-t-il si le serveur redémarre?Déploiement de CherryPy (daemon)

Existe-t-il une recette standard? Peut-être que quelque chose va créer un script de service (/etc/init.d/cherrypy ...)

Merci!

Répondre

14

Il y a un plugin Daemonizer pour CherryPy inclus par défaut qui est utile pour l'obtenir pour commencer, mais de loin le moyen le plus facile pour les cas simples est d'utiliser le script cherryd:

> cherryd -h 
Usage: cherryd [options] 

Options: 
    -h, --help   show this help message and exit 
    -c CONFIG, --config=CONFIG 
         specify config file(s) 
    -d     run the server as a daemon 
    -e ENVIRONMENT, --environment=ENVIRONMENT 
         apply the given config environment 
    -f     start a fastcgi server instead of the default HTTP 
         server 
    -s     start a scgi server instead of the default HTTP server 
    -i IMPORTS, --import=IMPORTS 
         specify modules to import 
    -p PIDFILE, --pidfile=PIDFILE 
         store the process id in the given file 

En ce qui INIT Le script .d va je pense qu'il y a des exemples qui peuvent être googlé.

Et le cherryd se trouve dans votre:

virtualenv/lib/python2.7/site-packages/cherrypy/cherryd

ou: https://bitbucket.org/cherrypy/cherrypy/src/default/cherrypy/cherryd

15

Daemonizer peut être assez simple à utiliser:

# this works for cherrypy 3.1.2 on Ubuntu 10.04 
from cherrypy.process.plugins import Daemonizer 
# before mounting anything 
Daemonizer(cherrypy.engine).subscribe() 

cherrypy.tree.mount(MyDaemonApp, "/") 
cherrypy.engine.start() 
cherrypy.engine.block() 

There is a decent HOWTO for SysV style here.

Pour résumer:

  1. Créez un fichier nommé pour votre application dans /etc/init.d qui appelle /bin/sh

    sudo vim /etc/init.d/MyDaemonApp

    #!/bin/sh 
    echo "Invoking MyDaemonApp"; 
    /path/to/MyDaemonApp 
    echo "Started MyDaemonApp. Tremble, Ye Mighty." 
    
  2. exécutable Faites

    sudo chmod +x /etc/init.d/MyDaemonApp

  3. Exécutez update-rc.d pour créer nos liens appropriés dans le bon répertoire d'exécution.

    sudo update-rc.d MyDaemonApp defaults 80

  4. sudo /etc/init.d/MyDaemonApp

+2

Je n'ai aucune idée de ce qu'est un 'spizouzou', mais la variable est entièrement inutile. Il suffit de dire: 'Daemonizer (cherrypy.engine) .subscribe()' et le plugin persistera car le 'moteur' garde maintenant une référence active. –

+0

@brandon craig rhodes est correct. Pas besoin de créer une variable. – lysdexia

+3

http://tools.cherrypy.org/wiki/WindowsService Comme mentionné ailleurs, on peut créer un service Windows avec à peu près le même effort. Faites attention aux bits d'enregistrement au bas de la page! Ils sont importants. – lysdexia

5

j'ai écrit un squelette tutoriel/projet, cherrypy-webapp-skeleton, dont le but était de combler les lacunes pour le déploiement d'un monde réel l'application CherryPy sur Debian * pour un Web- développeur. Il dispose de cherryd étendu pour la suppression des privilèges du démon. Il existe également un certain nombre de fichiers de script et de configuration importants pour init.d, nginx, monit, logrotate. La partie tutoriel décrit comment assembler les éléments et éventuellement les oublier . La partie squelette propose un moyen d'arrangement possible des actifs du projet webry CherryPy.


* Il a été écrit pour Squeeze mais il devrait être le même pour Wheezy.

+0

Le code de ce tutoriel a été très utile, merci –

1

Infos sur les options Daemonizer

Lorsque vous utilisez Daemonizer, le docs ne précisent pas les options, par exemple comment rediriger stdout ou stderr. De la source de la classe Daemonizer vous pouvez trouver les options. À titre de référence, prenez cet exemple de mon projet:

# run server as a daemon 
d = Daemonizer(cherrypy.engine, 
       stdout='/home/pi/Gate/log/gate_access.log', 
       stderr='/home/pi/Gate/log/gate_error.log') 
d.subscribe()