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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
-XX:OnOutOfMemoryError="/yourscripts/tomcat-restart"
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="/home/BEGIN.sh"
[Le problème]
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

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
-Au final ma question est la suivante:
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