2009-05-14 3 views
0

Je suis en train de configurer un serveur Debian Etch pour héberger des applications ruby ​​et php avec nginx. J'ai réussi à configurer inittab pour démarrer le processus php-cgi au démarrage avec l'action respawn. Après avoir servi 1000 requêtes, les processus de travail php-cgi meurent et sont réapparus par init. Le record inittab ressemble à ceci:Comment raccourcir une entrée de processus inittab, a.k.a., où placer les variables d'environnement qui seront vues par init?

50:23:respawn:/usr/local/bin/spawn-fcgi -n -a 127.0.0.1 -p 8000 -C 3 -u someuser -- /usr/bin/php-cgi 

je l'ai écrit d'abord l'entrée de processus (tout après le 3e point) dans un script séparé (simplement parce qu'il était long) et mettez le nom du script dans le dossier inittab, mais parce que le script irait à sa seule ligne et mourir, syslog a été rempli d'erreurs comme ceci:

May 7 20:20:50 sb init: Id "50" respawning too fast: disabled for 5 minutes 

Ainsi, je me suis débarrassé du fichier de script et vient de mettre toute la ligne dans le inittab. Désormais, aucune erreur n'apparaît dans le syslog.

Maintenant, je tente la même chose avec thin pour servir une application de rails. Je peux commencer avec succès le serveur mince en exécutant cette commande:

sudo thin -a 127.0.0.1 -e production -l /var/log/thin/thin.log -P /var/run/thin/thin.pid -c /path/to/rails/app -p 8010 -u someuser -g somegroup -s 2 -d start 

Il fonctionne apparemment exactement la même chose si j'utilise le -d (daemonize) drapeau ou non. Le contrôle de ligne de commande revient immédiatement (les processus ont été démonisés) de toute façon. Si je mets toute cette commande (moins le sudo et avec des chemins absolus) dans inittab, init se plaint (dans syslog) que l'entrée de processus est trop longue, donc je mets les options dans une variable d'environnement exportée dans/etc/profile. Maintenant, je peux commencer avec succès le serveur avec:

sudo thin $THIN_OPTIONS start 

Mais quand je mets cela dans un dossier inittab avec l'action respawn

51:23:respawn:/usr/local/bin/thin $THIN_OPTIONS start 

les journaux indiquent clairement que la variable d'environnement ne soit pas visible à init; c'est comme si la commande était simplement "mince".

Comment raccourcir l'entrée de processus inittab? Existe-t-il un autre fichier que/etc/profile où je pourrais définir la variable d'environnement THIN_OPTIONS? Mon expérience antérieure avec php-cgi me dit que je ne peux pas simplement mettre toute la commande dans un script séparé.

Répondre

0

script init.d

Utilisez un script dans

/etc/rc.d/init.d 

et définir le niveau d'exécution

Voici quelques exemples avec mince, rubis, apache

http://articles.slicehost.com/2009/4/17/centos-apache-rails-and-thin

http://blog.fiveruns.com/2008/9/24/rails-automation-at-slicehost

http://elwoodicious.com/2008/07/15/nginx-haproxy-thin-fastcgi-php5-load-balanced-rails-with-php-support/

qui fournissent un exemple initscripts à utiliser.

modifier: Asker a souligné que cela ne permettra pas de réapparition. J'ai suggéré de forker dans le script init et de désavouer le processus afin que init ne se bloque pas (il pourrait fork() le script lui-même, va vérifier). Et ensuite créer une boucle infinie qui attend le processus serveur pour mourir et le redémarrer.

edit2: Il semblerait que init fourchera le script. Juste une boucle devrait le faire.

+0

Merci - un problème que cette réponse ne gère pas est de réapparaître le serveur léger si/quand il meurt. Une personne devrait se connecter et démarrer manuellement à ce moment-là, ce que nous pouvons déjà faire. Pour autant que je sache, seul inittab permet une réapparition automatique. Si quelqu'un connaît un moyen de dire à init de réapparaître les scripts init.d, cela résoudrait aussi mon problème. – towynlin

+0

Peut-être déboîter (désolé) dans le script init dans une boucle qui démarre à plusieurs reprises le serveur, puis si le processus meurt, la boucle redémarre et le serveur fait, ad infinitum. –

+0

Après avoir fonctionné pendant plusieurs jours, le processus mince n'est pas mort. Cela m'amène à croire que thin fonctionne différemment que (1) le processus php-cgi lui-même ou (2) quelque chose a commencé avec spawn-fcgi (je ne sais pas lequel) - intrinsèquement destiné à mourir après avoir servi un certain nombre de demandes Armé de cette connaissance, je crois maintenant que je n'ai pas besoin de m'inquiéter de la réapparition, bien que la réponse d'Aiden ferait l'affaire si j'avais besoin de m'assurer que la mince réapparaîtrait. J'ai créé un script init.d très simple qui appelle simplement "thin start" ou "thin stop" avec les arguments appropriés. – towynlin

1

Et pourquoi n'appelez-vous pas un wrapper qui commence mince avec vos options?

start_thin.sh:
#/bin/bash
/usr/local/bin/mince -a 127.0.0.1 production -e -l /var/log/thin/thin.log -P/var/run/mince/thin.pid -c/chemin/vers/rails/app -p -u 8010 someuser -g -s somegroup 2 -d démarrer

puis:
51: 23: respawn:/usr/local/bin/start_thin

Questions connexes