Bonjour à tous et a toutes.
[Contexte]
Les informations qui vont suivre ne sont pas essentielles à la compréhension du problème.
Je cherche a faire un restart automatique de plusieurs Tomcats lorsque Out of memory arrive, pour cela il suffit de placer cette argument lors du lancement du Tomcat
J'ai une dizaine de tomcat et pour pouvoir les restart j'ai besoin de savoir quel tomcat à planter en récupérant son PID et son NOM
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 -XX:OnOutOfMemoryError="/yourscripts/tomcat-restart"
[Le problème]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 -XX:OnOutOfMemoryError="/home/BEGIN.sh"
Java appelle donc mon script BEGIN.sh lorsque le tomcat plante, celui-ci récupére le PID du tomcat et son nom puis il lance le script OOM.sh qui traite les valeurs et fait des tests pour restart le tomcat dans de bonnes conditions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #!/bin/bash ##Récuperation du PID du tomcat echo $PPID pidtom=$(ps -ef -q $PPID| awk '{ print $3; }' | grep -v PPID) # on récupère le pid du tomcat pidtom=$(echo $pidtom) echo $pidtom #le pid du Tomcat a kill echo $pidtom > /home/pidtom # on récupère le pid ##Recupération du nom du tomcat nametom=$(ps aux -q $pidtom | grep -E -o 'tomcat\w+' | head -n 1) nametom=$(echo $nametom) echo $nametom #le nom du Tomcat echo $nametom > /home/nametom #sleep 20 cd /home/ exec nohup ./OOM.sh &
lorsque OOM.sh est appelé par BEGIN.sh il garde le port d'écoute de la jvm même après que le tomcat soit kill
Avant KILL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 16948 root 4u IPv4 144075 0t0 TCP *:55557 (LISTEN) OOM.sh 16991 root 4u IPv4 144075 0t0 TCP *:55557 (LISTEN) sleep 16994 root 4u IPv4 144075 0t0 TCP *:55557 (LISTEN)
Après KILL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME OOM.sh 17480 root 4u IPv4 150679 0t0 TCP *:55557 (LISTEN) sleep 17498 root 4u IPv4 150679 0t0 TCP *:55557 (LISTEN)
Au moment d’effectuer le restart du tomcat ça ne marche pas car le port d'écoute est utilisé par le script lui même .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ERROR: transport error 202: bind failed: Adresse déjà utilisée ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
J'ai essayer d'appeler mon script de différentes manières dans BEGIN.sh mais cela ne change rien
-Au final ma question est la suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ./OOM.sh & nohup ./OOM.sh & exec ./OOM.sh exec nohup ./OOM.sh & disown
Comment faire pour que le script OOM.sh ne soit plus lié a java et a ce port d'écoute ?
-Questions subsidiaires:
Pourquoi mon script hérite du port d'écoute du tomcat, est-ce lié au file descriptor ?
Merci d'avance
Partager