227 votes

Comment arrêter un job zombie inarrêtable sur Jenkins sans redémarrer le serveur ?

Notre serveur Jenkins a un travail qui est en cours d'exécution depuis trois jours, mais qui ne fait rien. Cliquer sur le petit X dans le coin ne fait rien, et le journal de sortie de la console n'indique rien non plus. J'ai vérifié sur nos serveurs de construction et la tâche ne semble pas s'exécuter du tout.

Existe-t-il un moyen de dire à Jenkins que le travail est "terminé", en éditant un fichier, un verrou ou autre ? Comme nous avons beaucoup de tâches, nous ne voulons pas vraiment redémarrer le serveur.

30voto

mugi Points 390

Une fois, j'ai rencontré un build qui ne pouvait pas être arrêté par la "script Console". Finalement j'ai résolu le problème avec ces étapes :

ssh onto the jenkins server
cd to .jenkins/jobs/<job-name>/builds/
rm -rf <build-number>
restart jenkins

27voto

cheffe Points 6854

J'utilise le plugin de surveillance pour cette tâche. Après l'installation du plugin

  1. Allez dans Gérer Jenkins > Surveillance du maître Hudson/Jenkins.

  2. Développez les détails des fils, le petit lien bleu sur le côté droit.

  3. Recherchez le nom du poste qui est accroché

    Le nom du fil commencera comme ceci

    Executor #2 for master : executing <your-job-name> #<build-number>

  4. Cliquez sur le bouton rouge et rond tout à droite dans le tableau de la ligne de l'emploi que vous souhaitez.

16voto

Levente Holló Points 324

Si vous avez un travail de Pipeline imparable, essayez ce qui suit :

  1. Abandonnez la tâche en cliquant sur le X rouge à côté de la barre de progression de la construction.
  2. Cliquez sur "Pause/reprise" sur la construction pour faire une pause.
  3. Cliquez à nouveau sur "Pause/resume" pour reprendre la construction.

Pause/Resume pipeline job

Jenkins se rendra compte que le travail doit être terminé et arrêtera la construction.

9voto

Simon Points 291

Je suppose qu'il est trop tard pour répondre mais je peux aider certaines personnes.

  1. Installez le plugin de surveillance. ( http://wiki.jenkins-ci.org/display/JENKINS/Monitoring )
  2. Allez à jenkinsUrl/monitoring/nodes
  3. Allez dans la section "Threads" en bas de page.
  4. Cliquez sur le bouton "Détails" à gauche du master.
  5. Trier par Temps utilisateur (ms)
  6. Regardez ensuite le nom du fil de discussion, vous y trouverez le nom et le numéro de la construction.
  7. Tuez-le.

Je n'ai pas assez de réputation pour poster des images, désolé.

J'espère que cela pourra vous aider

8voto

jayhendren Points 1679

El meilleure réponse a presque fonctionné pour moi, mais j'avais un problème majeur : j'avais un très grand nombre (~100) de tâches zombies en raison d'un redémarrage de Jenkins particulièrement mal à propos, donc trouver manuellement le nom de la tâche et le numéro de construction de chaque tâche zombie et ensuite les tuer manuellement était infaisable. Voici comment j'ai trouvé et tué automatiquement les travaux zombies :

Jenkins.instance.getItemByFullName(multibranchPipelineProjectName).getItems().each { repository->
  repository.getItems().each { branch->
    branch.builds.each { build->
      if (build.getResult().equals(null)) {
        build.doKill()
      }
    }
  }
}

Ce script boucle sur tous les builds de tous les jobs et utilise getResult().equals(null) pour déterminer si le travail est terminé ou non. Un build qui est dans la file d'attente mais qui n'a pas encore été lancé ne sera pas itéré (puisque ce build ne sera pas dans la liste des projets de l job.builds ), et un build qui est déjà terminé retournera autre chose que null pour build.getResult() . Un travail légitimement exécuté aura également un résultat de construction de null Il faut donc s'assurer qu'il n'y a pas de tâches en cours d'exécution que vous ne voulez pas tuer avant de l'exécuter.

Les multiples boucles imbriquées sont principalement nécessaires pour découvrir chaque branche/PR pour chaque dépôt dans un projet Multibranch Pipeline ; si vous n'utilisez pas Multibranch Pipelines vous pouvez simplement boucler sur tous vos travaux directement avec quelque chose comme Jenkins.instance.getItems().each .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X