10
votes

Comment définir une variable d'environnement dans le pré-démarrage dans le script UPSTART?

Nous avons une application de démon C ++ personnalisée qui fourche une fois. Nous l'avons donc fait cela dans notre script UPSTART sur Ubuntu 12.04 et cela fonctionne parfaitement: xxx pré>

Cependant, nous devons maintenant passer à une dispute à notre application qui contient le nombre de processeurs sur le machine sur laquelle il fonctionne: p> xxx pré>

notre première tentative était la suivante: p> xxx pré>

tandis que cela démarre notre application avec le bon -t Valeur, UPSTART suit la mauvaise valeur PID, je suppose que celles-ci, Grep & WC commande toutes les processus de lancement dans EXED avant notre application. P>

J'ai également essayé, et même ça ne le fait pas Travailler, je suppose que parce que la définition d'un VaR envoie un processus? UPSTART suivit toujours le mauvais PID: P>

pre-start
    NUM_CORES=32
end script


0 commentaires

3 Réponses :


17
votes

C'est gênant. La méthode recommandée consiste à écrire un fichier env dans la Stanza de pré-démarrage, puis à la source dans le script Stanza. C'est ridicule, je sais.

expect fork

pre-start script
    exec >"/tmp/$UPSTART_JOB"
    echo "NUM_CORES=$(cat /proc/cpuinfo | grep processor | wc -l)"
end script

script
    . "/tmp/$UPSTART_JOB"
    /path/to/app -t "$NUM_CORES"
end script

post-start script
    rm -f "/tmp/$UPSTART_JOB"
end script


3 commentaires

Super utile! Une chose: je pense que vous devez toujours utiliser "EXEC / PATH / TO / APP" à l'intérieur du bloc de script si c'est ce dont vous avez besoin pour le suivi PID avant. Une fois que j'ai ajouté "EXEC" de retour, cela fonctionnait magnifiquement pour moi.


@ Codya.ray qui dépend entièrement du comportement de la fourche du service en cours de démarrage. Dans notre cas, Attendez-vous au démon peut avoir été approprié.


Ne pouvait pas être plus reconnaissant pour cela !! Était en difficulté avec elle pendant plus d'une semaine.



0
votes

J'ajouterais xxx

après avoir attribué une valeur dans "script". Je me souviens que A / Bin / SH symbolisé à une coque non bash peut exécuter des scripts, alors je voudrais éviter les constructions de Bash-seulement.

RE: Utilisation de "env" Stanza, il passe littéralement des valeurs et ne pas les traiter avec des conventions shell.


0 commentaires

2
votes

Selon la configuration UPStart de ZRAM-CONFIG:

script
    NUM_CORES=$(grep -c ^processor /proc/cpuinfo | sed 's/^0$/1/')
    /path/to/the/app -t $NUM_CORES
end script


1 commentaires

Le problème avec c'est que $ () fourche un processus enfant (puis le tuyau provoque une autre fourchette), qui peut confondre le suivi de la fourche. Si vous fourrez plus de deux fois avant votre démon actuel, plus ancien UpStart ne peut pas suivre le processus de démon, puis Respawn ne fonctionnera pas correctement. Cela fonctionne pour ZRAM-CONFIG car cela ne fonctionne qu'une seule fois et n'a pas besoin de DEPAWN, mais ce n'est pas universel. :) C'est pourquoi la réponse de @ MPM est nécessaire.