[KSH] [AIX] Terminaison innatendue de script

Terminaison innatendue de script [KSH] [AIX] - Shell/Batch - Programmation

Marsh Posté le 13-01-2012 à 11:34:09    

Un script ksh sur AIX 5.3 se termine de temps en temps de manière subite et inattendue.
Le script lance un shell fils comme suit
 
Code :

Code :
  1. trap 'rm -f /tmp/res.log;exit 0' 2 3 4 15
  2. run_child.sh > /tmp/res.log 2>&1
  3. echo "run_child.sh is terminated"
  4. next instructions...
  5. rm -f /tmp/res.log


 
de temps en temps, l'echo et les next instructions ne sont pas exécutées.
en set -x, on peut voir que la dernière instruction exécutée est  
 

Code :
  1. + run_child.sh > /tmp/res.log 2>&1


 
pourtant en traçant run_child.sh, il semble aller au bout (j'ai mis un echo juste avant sa dernière instruction d'exit 0), et on peut voir le resultat de cet echo dans la trace...
Quelqu'un saurait ce qu'il peut se passer car je suis sec, j'ai fait le tour des possibilités...

Reply

Marsh Posté le 13-01-2012 à 11:34:09   

Reply

Marsh Posté le 14-01-2012 à 20:54:57    

rivalgro a écrit :

Un script ksh sur AIX 5.3 se termine de temps en temps de manière subite et inattendue.
Le script lance un shell fils comme suit
 
Code :

Code :
  1. trap 'rm -f /tmp/res.log;exit 0' 2 3 4 15
  2. run_child.sh > /tmp/res.log 2>&1
  3. echo "run_child.sh is terminated"
  4. next instructions...
  5. rm -f /tmp/res.log


 
de temps en temps, l'echo et les next instructions ne sont pas exécutées.
en set -x, on peut voir que la dernière instruction exécutée est  
 

Code :
  1. + run_child.sh > /tmp/res.log 2>&1



Salut
Tu dis que l'echo "run_child.sh is terminated" n'est pas exécuté. Mais le script s'est-il arrêté ou est-il toujours en cours ?
S'il est toujours en cours ça veut dire qu'il est toujours sur "run_child.sh".
S'il s'est arrêté peut-être est-ce parce qu'il est passé par l'exit du "trap"...
 

rivalgro a écrit :

Quelqu'un saurait ce qu'il peut se passer car je suis sec, j'ai fait le tour des possibilités...


Rajoute un echo dans le trap. Tu verras bien s'il passe par là...

Reply

Marsh Posté le 15-01-2012 à 16:13:45    

^ je plussoie
Peut-être qu'avec truss tu peux voir si le script reçoit un signal ?

Reply

Marsh Posté le 17-01-2012 à 11:07:11    

pas besoin de rajouter d'echo dans le trap, puisque dans le trap il y adéjà le rm qui n'est pas executé. Et le script n'est plus en execution, il y a terminaison du père et fils.
Comment pourrais je tracer sachant que c'est du mode agent (le script est lancé par un agent de supervision à intervalle régulier...
Un lancement de type script.sh | truss -p $$ > /tmp/truss.log 2>&1 ... ?

Reply

Marsh Posté le 17-01-2012 à 13:21:02    

Salut
tu peux envisager de lancer le truss en tâche de fond, avec un sudo, avant l'exécution du sous-script .sh.
Déjà voir ce que le parent reçoit comme instruction de fin (sigkill ou un autre signal pouvant être attrapé)

Reply

Marsh Posté le 17-01-2012 à 18:00:13    

je vais essayer ça ...

Reply

Marsh Posté le 19-01-2012 à 08:31:47    

j'ai une trace truss lors d'un plantage...
Quelqu'un peut m'aider à analyser cela ?
 
Voilà les dernières ligne de la trace truss
 

Code :
  1. +4689  open("/var/opt/OV/tmp/txt_138274.tmp", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) = 3
  2. +4690  close(1)                                        = 0
  3. +4691  kfcntl(3, F_DUPFD, 0x00000001)                  = 1
  4. +4692  close(3)                                        = 0
  5. +4693  kfcntl(1, F_GETFL, 0x00000000)                  = 67108865
  6. +4694  kwrite(2, " 1 >   / v a r / o p t /".., 34)     = 34
  7. +4695  fstatx(15, 0x2FF20CF0, 76, 0)                   = 0
  8. +4696  kwrite(1, " T h u   J a n   1 9   0".., 114)    = 114
  9. +4697  close(1)                                        = 0
  10. +4698  kfcntl(15, F_DUPFD, 0x00000001)                 = 1
  11. +4699  close(15)                                       = 0
  12. +4700  kfcntl(1, F_SETFD, 0x00000000)                  = 0
  13. +4701  kwrite(2, " +   / v a r / o p t / O".., 72)     = 72
  14. +4702  kioctl(2, 22528, 0x00000000, 0x00000000)        Err#25 ENOTTY
  15. +4703  kfork()                                         = 268964
  16. +4704  _sigaction(20, 0x00000000, 0x2FF20E20)          = 0
  17. +4705  _sigaction(20, 0x2FF20E20, 0x2FF20E30)          = 0
  18. +4706  kwaitpid(0x2FF20E90, -1, 6, 0x00000000, 0x00000000) (sleeping...)
  19. +4707  kwaitpid(0x2FF20E90, -1, 6, 0x00000000, 0x00000000) Err#82 ERESTART
  20. +4708  *** process killed ***


 
couplée aux dernières lignes de la trace set -x

Code :
  1. + Sid=Oracle_ICHORF00_
  2. + date
  3. + echo Thu Jan 19 08:17:53 NFT 2012 : Execution de /var/opt/OV/bin/instrumentation/fij_launch_hpov_alert_inv.sh ICHORF00
  4. + 1> /var/opt/OV/tmp/txt_138274.tmp
  5. + /var/opt/OV/bin/instrumentation/fij_launch_hpov_alert_inv.sh ICHORF00
  6. + 1>> /var/opt/OV/tmp/txt_138274.tmp 2>& 1


 

Reply

Marsh Posté le 19-01-2012 à 10:32:16    

en gros le process est killé au moment de la sortie du fils...  
comment savoir d'où vient cet ordre car il est clair qu'il ne vient pas du script...

Reply

Marsh Posté le 19-01-2012 à 17:06:26    

J'ai l'impression qu'il y a un script externe qui envoie un SIGKILL au ksh parent.
 
Existe-t-il un paramètre définissant une durée maximale d'exécution par l'application qui lance le script (trap snmp, ordonnanceur, etc.) ?
Constates-tu une durée constante d'exécution avant que le tout soit killé ?

Reply

Marsh Posté le 20-01-2012 à 09:40:09    

Il y a une fonction interne au script père qui gère un timeout avec SIGKILL au bout de 300 secondes, mais 1) j'ai vérifié qu'elle ne s'enclenchait pas, 2) le script ne dure quelques secondes avant de recevoir ce signal. J'ai l'impression que c'est au niveau système que cela se passe...  
la ligne juste avant le kill ne mettrait pas la puce à l'oreille ?
kwaitpid(0x2FF20E90, -1, 6, 0x00000000, 0x00000000) Err#82 ERESTART

Reply

Marsh Posté le 20-01-2012 à 09:40:09   

Reply

Marsh Posté le 20-01-2012 à 11:02:37    

Pour moi ça signifie que le shell attend le retour du fils (signal child) mais que cette attente est interrompue subitement (par le signal 9).
Le script père en question, est-il possible de le tracer ?

Reply

Marsh Posté le 20-01-2012 à 14:10:34    

il est déjà tracé, cf la trace truss...
tu parles peu être du processus qui le lance ?

Reply

Marsh Posté le 20-01-2012 à 14:49:31    

oui

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed