J'ai un problème avec un script que j'ai lancé via /etc/service
et que j'utilise runit
.
Mon script sur /etc/service/myApp/run
ressemble à ceci:
#!/bin/bash
cd /src
forever -l forever.log -o out.log -e err.log -a start bin/www
Ce que Forever exécute mon script en tant que démon. Mais cela semble faire croire à Runit que mon service est terminé et qu'il exécute /etc/service/myApp/run
encore et encore, et encore et encore ...
J'ai également essayé d'exécuter ceci non en tant que démon et cela fonctionne bien si vous courez au premier plan, mais j'ai toujours un problème. J'ai une commande clean-shutdown à envoyer à mon serveur à un moment donné qui va éventuellement arrêter le processus de premier plan et je ne veux pas qu'il redémarre. Mais à mon grand désarroi, /etc/service/myApp/run
est appelé immédiatement pour redémarrer mon serveur :(
Je ne suis pas administrateur système, donc la plupart de ces aspects sont nouveaux pour moi. Tout ce que je veux, c'est que mon script s'exécute au démarrage et non au redémarrage automatique. Merci de votre aide.
EDIT: J'ai mis à jour ma question pour inclure le fait que runit
est utilisé ici. Je vois que runit surveille les processus pour maintenir les services. Ma question demeure cependant.
C'est très facile. Comme vous l'avez déjà constaté, il est toujours inutile de s'inscrire ici, car runit est déjà un gestionnaire de services et démarre et redémarre déjà votre programme.
Comme vous l'avez déjà observé, il existe quelques règles pour ce que les programmes run
doivent faire. Ils ne doivent pas bifurquer et quitter le programme principal. Le gestionnaire de services runit, comme la plupart des gestionnaires de services daemontools-family (il existe toute une famille de logiciels qui fonctionnent de cette manière), s'attend à ce que le processus exécutant le programme run
soit le démon. Pas son parent. Pas un bref survol qui fourches et sorties. Mais le démon lui-même.
run
Différents langages de script permettent d'écrire de tels programmes run
. Laurent Bercot execline
est un. Mon programme nosh
en est un autre. En supposant que _bin/www
_ soit le programme exécutable de votre démon, un script nosh run
ressemblerait à quelque chose comme:
#!/bin/nosh fdmove -c 2 1 chdir /src bin/www
Un script execline est pareillement bref. Mais le script Shell n’est plus très long. Si votre programme run
est un script Shell, il ne faut pas oublier de superposer le programme Shell avec votre programme de démon dans le même processus. La commande Shell pour cela est exec
et un script Shell ressemble donc à quelque chose comme:
#!/bin/sh -e exec 2> & 1 cd /src[.____. Printer
Je recommande fortement que, si votre programme ne nécessite pas les privilèges de superutilisateur, vous l'exécutez via le chpst
programme (et son option _-u
_), afin qu’il commence en tant qu’utilisateur non privilégié - pour de meilleurs résultats, dédié à ce service.
Plusieurs personnes ont rassemblé et publié des suites de programmes run
au fil des ans, et la plupart des programmes run
sont aussi courts et simples. Puisque vous avez lancé runit, vous pouvez commencer avec la propre collection de programmes run
de Gerrit Pape.
Lorsqu’il s’agit de démarrer et d’arrêter le service, encore une fois, il faut demander à la plupart des gestionnaires de services daemontools-family d’arrêter le redémarrage automatique du service. Ils viennent tous avec un outil pour le faire. Il vous suffit de l'utiliser dans votre script _clean-shutdown
_.
sv
programme: _sv down /etc/service/MyApp
_s6-svc
programme: _s6-svc -d /etc/service/MyApp
_perpctl
programme: _perpctl d /etc/service/MyApp
_svc
: _svc -d /etc/service/MyApp
_svc
: _svc -d /etc/service/MyApp
_service-control
programme: _service-control --down /etc/service/MyApp
_ qui est également alias svc
: _svc -d /etc/service/MyApp
_J'ai dit que c'était une famille d'outils. En fait, sous la couverture, tous ces outils parlent essentiellement du même protocole.
Cela m'amène à un point plus large. Tous ces outils ne sont pas exclusifs. Ce n'est pas parce que vous l'avez lancé que vous utilisez execline
si vous le souhaitez. Ou vous pouvez exécuter un script nosh
sous le gestionnaire de services de s6.
Vous avez essayé d'écrire des fichiers journaux avec toujours. Encore une fois, n'utilisez pas pour toujours. Ce n'est pas la bonne façon de vous connecter avec runit. La redirection de la sortie standard et des erreurs directement vers les fichiers rend vos journaux impossibles à faire pivoter, à limiter la taille et autrement à contrôler, sans interférence drastique dans le fonctionnement de votre démon.
les gestionnaires de services daemontools-family tous se connectent en ayant la sortie d'un main service connecté, par un tuyau ordinaire, à l'entrée d'un autre service log . Ce canal est configuré par le gestionnaire de service. Tu ne le fais pas toi-même.
Le service de journalisation est un autre service . Il exécute l'un des nombreux outils disponibles qui lisent simplement à partir de son entrée standard et écrivent dans un ensemble de fichiers journaux à rotation à la demande et strictement limités en taille, dans un répertoire de journaux.
Ces programmes sont multilog
, multilog
, s6-log
, tinylog
, cyclog
, et svlogd
lequel est celui que vous allez trouver qui vient dans la boîte à outils avec runit.
En fait, vous remarquerez peut-être que celui qui a configuré _/etc/service/MyApp
_ a déjà déjà configuré un service de journalisation dans _/etc/service/MyApp/log
_. Sinon, un script de service de journalisation est extrêmement simple:
#!/bin/sh -e exec chpst -uMyApp-log svlogd -t ./main
Créez simplement un compte d'utilisateur nommé _MyApp-log
_, _mkdir /etc/service/MyApp/log/main
_, _chown MyApp-log /etc/service/MyApp/log/main
_ et vous êtes absent. (Notez que main
peut être un lien symbolique vers un autre endroit où vous créez le répertoire. Vous n'avez pas besoin de mettre les journaux sous _/etc
_ avec runit. J'ai mis mes répertoires de journaux sous _/var/log/sv
_.)
Vous ne faites rien du tout à votre service principal de cycle et de journaux de taille maximale. Le cycle et la limitation de taille se produisent indépendamment, dans le processus de service de journal .