Pourquoi mon service upstart ne démarre-t-il pas au démarrage du système?


37

Suite à cette question , j’ai écrit un simple service de démarrage ( /etc/init/pms.conf ) pour ma boîte sans tête Ubuntu Server 11.04 comme suit:

start on filesystem and net-device-up IFACE=eth0
stop on runlevel [016]
respawn

exec /home/administrator/pms-current/PMS.sh

Je peux démarrer (ou arrêter) ce service à volonté depuis la ligne de commande:

service pms start

Et je peux voir que cela fonctionne vraiment.

Cependant, lorsque je démarre pour la première fois ma machine, le service ne démarre pas. Si je SSH dans la boîte et vérifier l'état du service, je reçois:

$ service pms status
pms stop/waiting

Ma question est pourquoi cela se produit-il? Pourquoi mon service ne démarre-t-il pas?

MISE À JOUR 1 : ne sachant pas si mon service était démarré et par la suite en train de mourir ou si ce n’était tout simplement pas le cas, j’ai ajouté ce qui suit à PMS.sh:

echo "STARTED" > $STARTLOG

Cela me donne évidemment quelque chose à rechercher. J'ai testé cela en démarrant le service moi-même, puis en vérifiant start.log . J'ai ensuite supprimé le fichier start.log et redémarré. Il n'était pas là après le redémarrage, il semble donc que Upstart ne démarre pas mon service. Je suppose que cela pourrait être en train de mourir plus tôt dans le processus, mais cela semble plutôt improbable compte tenu de la simplicité de tout cela.

MISE À JOUR 2 : Je viens de mettre à jour la version 11.10, qui inclut une mise à niveau récente, mais ce problème persiste.

MISE À JOUR 3 : Comme demandé, j'ai démarré avec --debug. La sortie de cat /var/log/syslog | grep initest trop longue à placer dans la question, mais vous la visualisez ici .

UPDATE 4 : Plus de journaux, cette fois la configuration upstart est incluse en haut. Exécuter 1 et exécuter 2 .


Êtes-vous sûr que le script n'a pas été exécuté? Le message pms stop / waiting signifie que le job upstart a été exécuté et que toutes les commandes se sont terminées normalement.
organiser

Ajoutez la sortie de cat /var/log/syslog | grep initaprès l'activation de la journalisation de démarrage pour Upstart en suivant les instructions de la rubrique Débogage Upstart
Ciaran Liedeman

@Anarci: veuillez consulter la mise à jour 3 dans ma question.
Kent Boogaart

La plupart des utilisateurs ne donneront pas leur adresse email comme ça, mais plutôt un lien vers un site pastebin comme Ubuntu pastebin
Ciaran Liedeman

@Anarci: c'est fait. S'il vous plaît voir ma question.
Kent Boogaart

Réponses:


19

Je recommanderais d'augmenter la verbosité du travail, par exemple en utilisant des entrées pré-début / post-début.

pre-start script
  logger "pre-start for myprog"
end script

post-start script
  logger "post-start for myprog"
end script

# and for PMS itself:
script
  logger "just before executing PMS"
  exec /home/administrator/pms-current/PMS.sh
end script

Plus d'informations sur http://upstart.ubuntu.com/cookbook/

Regardez aussi http://upstart.ubuntu.com/wiki/Debugging


Cela me fait vraiment penser. J'ai essayé une douzaine de choses différentes dans le dos de votre message. Tous ont échoué en faisant varier divers messages obscurs dans les journaux. Ma dernière tentative a abouti au processus principal init: pms (1329) terminé avec le statut 143 , ce qui ne signifie rien pour moi. Je peux voir que PMS.sh n'est même pas démarré, car la première chose qu'il fait est d'écrire dans son propre journal, et cette entrée de journal n'est pas présente. Je peux voir ma sortie de pré-démarrage, qui me dit que le fichier cible existe et est exécutable. Je reprendrai cela demain, mais si vous avez des idées, j'aimerais les entendre. Merci.
Kent Boogaart

salut @ KentBoogaart, il me semble avoir le même problème. Avez-vous trouvé une solution?
Daniele B

@ KentBoogaart J'ai le même problème que vous? Un peu de chance avec le tien?
Mevin Babu

14

Ce qui se passe probablement ici, c'est que pms commence avant que vos adaptateurs réseau ne soient disponibles et probablement avant même l'adaptateur de bouclage (lo). En supposant que nous parlions du serveur multimédia PS3, il s’agisse d’un service en réseau qui n’aime probablement pas le démarrage sans interfaces disponibles.

Essayez de changer votre critère de départ pour:

start on filesystem and net-device-up IFACE!=lo

Cela signifie que vous devez démarrer après la mise en place d’une interface réseau "réelle". Cependant, ce n'est peut-être pas idéal. Si eth0 est l'interface suivante, PMS démarre, mais vous voulez vraiment que PMS utilise wlan0, cela ne fonctionnera pas. Le service va démarrer mais il n'a peut-être pas été en mesure de choisir l'interface sur laquelle vous souhaitez l'écouter. En supposant que vous connaissiez l'interface sur laquelle vous allez diffuser et qu'elle ne changera pas, je la codifierais en dur dans le travail, par exemple:

start on filesystem and net-device-up IFACE=wlan0

Sur Oneiric (11.10), vous pouvez utiliser l'événement static-network-uppour attendre tous les périphériques configurés de manière statique. Ce qui est bien, car cela vous permet d'écrire des tâches dépendant du réseau sans coder en dur une interface. [Remarque: par "tous les périphériques configurés de manière statique", je me réfère à utiliser à la /etc/network/interfacesplace de NetworkManager. Cela ne signifie pas statique dans le sens d'une adresse IP statique par rapport à DHCP.]


Cela sonnait comme un truc, mais ça ne marchait pas. Je n'ai loet eth0mais je votre deuxième suggestion: start on filesystem and net-device-up IFACE=eth0. Toujours pas après un redémarrage. Je viens de remarquer quelque chose dans le journal PMS qui peut être une piste. Je vais enquêter et revenir ...
Kent Boogaart le

C'est intéressant. Une chose que je n'ai pas mentionnée, c'est que j'ai essayé votre script original et que cela a fonctionné au démarrage de ma machine. Je l’attribuais à la chance du tirage au sort (c’est-à-dire que dans les conditions de course, la bonne voiture a gagné et chez vous, la mauvaise a gagné). Je ne vois vraiment pas quelle autre dépendance nous manque ici. Bizarre.
Mark Russell

2
Comme vous pouvez le démarrer après le démarrage, une autre dépendance de service doit nous échapper. Un bidouillage sale qui pourrait fonctionner (mais ne nous éclairera pas du tout) est de simplement déposer un sleep 10- ou plus - dans un "script de pré-démarrage" avant d'exécuter le script shell.
Mark Russell

Désolé Mark - mais nous sommes sur la même page. J'ai déjà essayé le mode veille 10 dans un script de pré-démarrage. Ne pas aller. Ensuite, j'ai essayé de supprimer le fichier debug.log et de le redémarrer. Après le démarrage, j'avais le même statut de service et aucun fichier debug.log. Je ne suis donc pas convaincu que PMS est réellement exécuté. Y at-il un moyen facile de diagnostiquer cela? Si je modifie le fichier PMS.sh pour cracher une sortie, où ira-t-il? Je suppose que je pourrais toujours le diriger vers mon propre dossier - je pourrais peut-être essayer ensuite.
Kent Boogaart le

Je viens de mettre à jour ma question avec plus d'informations.
Kent Boogaart le

3

En examinant votre syslog, le processus pms commence sans erreur, mais peu de temps après, son objectif est modifié, ce qui signifie qu'il est tué.

Ceci est un peu étrange car vous avez ajouté la clause repsawn, elle devrait donc recommencer après avoir été arrêtée, mais ce n’est jamais le cas. Je suppose donc que vous avez supprimé la clause de réapparition.

Entre le démarrage et l'arrêt du service pms, seuls 2 services sont démarrés avec ufw et l'interface réseau (eth0), et 1 est lancé avec udev-fallback-graphics.

Il semble que votre processus pms soit démarré en parallèle. Malheureusement, la documentation récente est un peu floue sur les différences exactes entre start on ...vanilla et start on starting ...and start on started ....

Essayez de changer votre strophe de démarrage à

start on started networking

ou juste aussi

start on net-device-up IFACE=eth0

La sortie du journal est un peu étrange car l'événement net-device-up survient beaucoup plus tard, mais pms démarre avant.

Cela devrait faire en sorte que votre processus commence une seule fois tout en réseau mis en place est terminée à savoir le travail n'a pas seulement commencé mais fini.

De plus, n'approuvez pas complètement la sortie du journal. Au début du processus de démarrage, la journalisation de la sortie dans un fichier ne fonctionne pas toujours. Voir la réponse dans Debugging Upstart


3

Géré pour résoudre un problème similaire en utilisant start on runlevel à la place:

start on runlevel [2345]

3

J'ai eu le même problème et je l'ai finalement résolu simplement avec:

start on runlevel [2345]

sans net-device-upou started networkingtruc

Ceci est le script complet de départ, et cela fonctionne parfaitement:

# MyApp

description     "MyApp"
author          "me"

start on runlevel [2345]
stop on runlevel [016]

respawn

exec /usr/bin/myapp 2>> /var/logs/myapp.log

1

Je suis tombé sur chkconfiglors de ma formation RHCSA / CE:

sudo apt-get install chkconfig
sudo chkconfig pms on

Vous pouvez consulter sa page de manuel Oneiric pour plus de détails sur ses fonctionnalités.


1

J'ai trouvé une solution pour cela mais je ne la comprends pas. Si je déplace le syndrome prémenstruel avec /home/administratoret /bin/pmsroot en tant que propriétaire, tout fonctionne correctement.

Si je le laisse sous /home/administrator/mais que root est le propriétaire de tout, sauf le /home/administrator/répertoire lui-même, cela ne fonctionne toujours pas.

Si je configure l'administrateur en tant que propriétaire de tout et modifie la partie pertinente de mon script en:

sudo su administrator -c '/home/administrator/pms-current/PMS.sh'

Cela ne fonctionne toujours pas.

Je suppose que pour le moment je vais créer un /home/root/répertoire et y déplacer tout, même si j'aimerais bien comprendre tout cela.


Donc ça chkconfign'a pas marché non plus? Avez-vous essayé de donner le répertoire PMS.shétait à root? Si seule votre solution fonctionne, accédez à la page Launchpad de Upstart et contactez directement les développeurs.
Oxwivi

Et s'il suffit de déplacer le fichier, .shil suffit de tout conserver et d'éditer le script pour qu'il pointe vers ce répertoire (ou même de changer de répertoire?).
Oxwivi

Oui, j'ai essayé de créer la totalité du répertoire PMS appartenant à root. Cela n'a sans doute pas fonctionné car / home / administrator / n'appartient pas à root.
Kent Boogaart

De toute façon, cela n’a aucun sens, j’exécute régulièrement des scripts dans mon répertoire / home via upstart sans problème, ce qui est étrange.
organiser

Encore plus étrange: je viens d’essayer tout ce qui est sous / home / root / qui appartient évidemment à root. N'a pas fonctionné J'ai tout déplacé dans / bin / pms et cela a fonctionné à nouveau. Donc, il semble que tenter de relancer PMS de / home ne fonctionne pas sur mon système.
Kent Boogaart

1

J'ai eu un problème similaire "pas de départ" quand j'ai réalisé que mon script dépendait d'un fichier qui se trouvait chez moi et que la maison n'était pas accessible car elle était cryptée avec le mécanisme standard d'ubuntu (.Private).

start on local-filesystems événement est (probablement) émis avant la fin du processus de déchiffrement.


1

Votre répertoire personnel est-il sur NFS? Parfois, root ne peut pas accéder à NFS.

Pour mémoire, dans mon petit test du 12.04:

  • start on started networkinget start on network-interface-up INTERFACE=eth0 ne travaillent pas, mais

  • start on started network-interface INTERFACE=eth0 Est-ce que.

Merci à http://os4.org/wiki/upstart.html pour nous avoir signalé que le réseau d’emploi était initctl list toujours arrêté.


Le lien référencé est cassé.
slm


0

Semblable à @xuhcc, je suis venu ici pour savoir pourquoi mon script Vagrant Upstart ne fonctionnait pas. Ce qui suit est censé fonctionner:

commencer sur vagabond monté

Mais pas dans certaines versions en raison du bogue suivant.

https://github.com/mitchellh/vagrant/issues/6074

La solution de contournement indiquée dans le rapport a parfaitement fonctionné pour moi:

$ cat /etc/init/workaround-vagrant-bug-6074.conf 
# workaround for https://github.com/mitchellh/vagrant/issues/6074
start on filesystem
task

env MOUNTPOINT=/vagrant

script
  until mountpoint -q $MOUNTPOINT; do sleep 1; done
  /sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT=$MOUNTPOINT
end script

A bien fonctionné pour moi


0

cela a fonctionné pour moi (j'ai besoin de démarrer le service après iface up):

start on started networking and net-device-up IFACE=wlan1 
stop on shutdown

respawn
respawn limit 10 10
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.