2014-10-09 16 views

risposta

5

La tua risposta è Jenkins ProcessTreeKiller. A more detailed explanation here.

È una decisione di progettazione per eliminare tutti i processi generati dalla generazione per mantenere un ambiente pulito. Sfortunatamente ciò significa che non puoi lasciare un processo (come Tomcat) in esecuzione dopo la compilazione.

È possibile disattivare questa funzionalità a livello globale (non raccomandato) con il lancio di Jenkins in questo modo:
java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war

Oppure è possibile disattivare questo su una base per-caso, avviando il processo con una variabile di ambiente mutato:
BUILD_ID=dontKillMe ./catalina restart

Alcune persone segnalano tuttavia che la modifica di BUILD_ID non è sufficiente. Si consiglia inoltre di disinserimento:
JENKINS_COOKIE
JENKINS_SERVER_COOKIE

Edit:
Un altro problema che potrebbe essere in gioco è che quando ci si connette a shell remota, e avvia un processo in quella sessione shell remota, una volta tu (Jenkins) disconnetti, la sessione viene uccisa e anche tutti i processi generati dalla sessione vengono uccisi. Per risolvere questo problema, è necessario dissociare il processo dalla sessione della shell.

Un modo è:

nohup ./catalina restart &

+0

Ho già usato Jenkins ProcessTreeKiller senza successo. Quando ho avviato Jenkins con questo parametro, non ho notato alcuna differenza sul comportamento dei processi generati. – Joachim

+0

Sei connesso alla shell remota? Modificato la risposta per prendere in considerazione la shell remota – Slav

1

Questo è come mi sto riavvio di Tomcat dopo la distribuzione via Jenkins.

Sto avendo due server DEV e QA in cui ho bisogno di fare la distribuzione e riavviare tomcat. Ho installato Jenkins nel server DEV.

  1. Per prima cosa è necessario installare Post build task Plugin in Jenkins.
  2. Poi creare questo script tomcat-restart.ksh nel server in cui è stato installato Tomcat ..

#!/bin/bash echo "*********************Restarting Tomcat70.******************" sh /apps/apache/sss-tomcat70.ksh status echo "Trying to stop Tomcat." sh /apps/apache/sss-tomcat70.ksh stop echo "Getting Tomcat Status." sh /apps/apache/sss-tomcat70.ksh status echo "Trying to Start Tomcat" sh /apps/apache/sss-tomcat70.ksh start sleep 2 echo "Getting Tomcat Status" sh /apps/apache/sss-tomcat70.ksh status

riavvio di Tomcat sul server di DEV.

Poiché Jenkins e Tomcat sono installati nello stesso computer, sto chiamando direttamente lo script.

In Jenkins andare a Add post-build action e scegliere Post build task e nel Script testo aggiungere il seguente: /apps/apache/tomcat-restart.ksh

riavvio di Tomcat nel server di QA.

Poiché Jenkins è installato in un server diverso, sto richiamando lo script per riavviare Tomcat tramite Secure Shell.

In Jenkins vai a Aggiungere post-build action selezionare Post build task e nella casella di testo Script aggiungere il seguente:
sshpass -p 'myPassword' ssh -tt [email protected] sudo sh /apps/apache/tomcat-restart.ksh

È necessario installare sshpass se non è già installato.

Se tutto è andato bene, allora potresti vedere qualcosa di simile nel tuo log di Jenkins.

Running script : /apps/apache/tomcat-restart.ksh 
[workspace] $ /bin/sh -xe /tmp/hudson43653169595828207.sh 

+ /apps/apache/tomcat-restart.ksh 
*********************Restarting Tomcat70.********************* 
Tomcat v7.0 is running as process ID 3552 
*********************Trying to stop Tomcat.********************* 
Stopping Tomcat v7.0 running as process ID 3552... 
*********************Getting Tomcat Status.********************* 
Tomcat v7.0 is not running 
*********************Trying to Start Tomcat********************* 
Starting Tomcat v7.0 server... 

*********************Getting Tomcat Status********************* 
Tomcat v7.0 is running as process ID 17969 

Spero che questo aiuti.