Comment déboguer les scripts Upstart?

67

Pour une raison quelconque, je reçois une erreur lors de la mise à niveau de la ventilation , dont la cause est

% sudo service apport start
start: Job failed to start

Sous sysvinit, je pourrais résoudre ce genre de problème en exécutant par exemple

sudo sh -x /etc/init.d/whatever start

mais cela ne semble pas mapper vers Upstart. Que devrais-je essayer ensuite?

Il s'avère qu’il existe une solution permettant de poursuivre l’installation. Mais je suis toujours intéressé par la question générale de savoir comment on pourrait tracer le script.

poolie
la source
1
Je travaille sur une réponse plus complète, mais merci pour le lien vers la solution de contournement, la même chose m'est arrivée à jour natty aujourd'hui!
Mark Russell
Haha, et ils ont publié le correctif il y a 12 minutes. Lancer la Beta n'est-il pas amusant? (non vraiment!)
Mark Russell
+ Muhammad a posté la bonne réponse ci-dessous.
Travis Reeder
J'ai trouvé des informations de débogage utiles dans /var/log/syslog.
Matt

Réponses:

29

Toutes les informations suivantes (et une aide beaucoup plus utile pour Upstart) proviennent de The Upstart Cookbook . La section 18 couvre le débogage. http://upstart.ubuntu.com/cookbook/#debugging

Dans ce cas particulier de traçage d'une strophe "script" d'un travail Upstart, vous devez ajouter les lignes suivantes juste en dessous du mot "script":

exec 2>>/dev/.initramfs/myjob.log
set -x

La raison de cet emplacement impair est que /dev/.initramfs/ est disponible très tôt au démarrage, avant le chargement du système de fichiers racine, et continue à être disponible après l’amorçage. J'imagine que avec quot, cependant, vous n'avez probablement pas besoin d'utiliser ce chemin. Néanmoins, il est bon de connaître l'option.

Il convient également de noter que tous les scripts sont exécutés avec set -etoutes les commandes qui échouent. Ce qui est logique, car il faut être très prudent lorsque vous exécutez des scripts en tant que root.

Je recommande fortement de consulter le livre de recettes Upstart lié ci-dessus en général à quiconque travaille avec des tâches Upstart.

Mark Russell
la source
Merci pour cela, si je n'avais pas vu le bogue résolu, j'aurais probablement modifié le script pour l'activer set -xcomme vous le suggérez. Je me demandais surtout s'il y avait une façon plus propre de le faire.
poolie
Ouais, pas que je sache (et si ce n'est pas dans le livre de cuisine, ça veut dire qu'il n'y en a probablement pas). Outre cette idée, la plupart des techniques de débogage mentionnées concernent davantage le dépannage des événements Upstart et Upstart eux-mêmes, ce que je me trouve habituellement. :)
Mark Russell
Et pourtant, cette méthode échouera si setuidet setgidsont utilisés dans des travaux.
0xC0000022L
/dev/.initramfs n'est pas toujours présent. Je viens de tomber sur une machine qui n'a pas ce chemin.
Sarge Borsch
110

Upstart enregistre l’exécution de votre service dans un fichier journal portant le même nom dans /var/log/upstart/your-service-name.log. Ça devrait être utile.

Muhammad Gelbana
la source
2
Bien, il semblerait que cela inclue le nombre d'emplois, donc si j'activais, set -xcela apparaîtrait probablement là-bas.
poolie
1
J'ai inséré une instruction de journal basée sur l'écho dans mon script /etc/init.d/Xservice mais elle ne s'affiche pas à cet emplacement! OS: Ubuntu 14.04 Trusty
Champ
Pourquoi ne pas syslog? Puis-je suggérer une fonctionnalité générale, peut-être rsyslog elle-même, que upstart et tout composant utiliseraient pour écrire dans syslog si elle n’est pas disponible, ou dans un emplacement temporaire qui serait transféré vers syslog dès que possible. Cela m'a pris une demi-journée pour trouver ceci. S'il vous plaît transmettre cette remarque TIA.
Papou
4
Cela semble ne plus être vrai dans 16.04, apparemment depuis 15h10 au moins: les derniers fichiers de ce répertoire sont datés d'avant la sortie de la version 15.10.
MGF
1
@FGM c'est parce que 16.04 n'utilise plus upstart, il utilise systemd. Les journaux sont accessibles avecjournalctl
Jeremy