[shell] recuperer le numero de process d'un fils

recuperer le numero de process d'un fils [shell] - Shell/Batch - Programmation

Marsh Posté le 22-06-2007 à 14:47:58    

:hello:  
J'aurai besoin, dans un script en ksh, de recuperer le numero de process d'un script que je viens de lancer.

#!/bin/ksh
blablabla...
/chemin/commande
pid_commande=??? #l'option magique pour recuperer le pid de 'commande'
re-blablabla...

Problemes: je ne suis pas maitre de cette commande, donc je ne peux pas la modifier et lui faire renvoyer son pid ($$), et il faut que j'attende la fin de son traitement (tres rapide) avant de continuer, donc pas de lancement en background et ps | grep.
Voila voila...
Une idee?
Merci,
++

Reply

Marsh Posté le 22-06-2007 à 14:47:58   

Reply

Marsh Posté le 22-06-2007 à 15:14:39    

A ma connaissance il n‘est pas possible de récupérer le pid de la dernière commande exécutée sauf si celle-ci à été lancée en background.
Dans ce dernier cas on dispose de la variable $ !
 
Tu pourrais faire quelque chose du genre :

#!/bin/ksh  
blablabla...  
/chemin/commande &
wait $!
pid_commande=$!
re-blablabla...


 
jean-Pierre.

Reply

Marsh Posté le 22-06-2007 à 15:18:15    

Puisque la commande est très rapide, que tu es obligé de l'attendre et que tu dois impérativement récupérer son PID, je te propose d'utiliser "exec" à ton avantage.
 
En effet, 'exec' permet d'exécuter une commande en remplacement du processus courant.
Tu peux donc faire :

pid_commande=`echo $$ && exec /chemin/commande`

Reply

Marsh Posté le 22-06-2007 à 15:36:33    

Merci, je vais regarder tout ca, mais rapidement:
 
@aigles, j'avais essaye $!, mais quand je faisais un 'ls &' suivi d'un 'echo $!' le pid ne changeait que de temps en temps :pt1cable: , c'est vraiment bizarre. ptet un comportement etrange sous AIX 5.3. faut que je reteste dans les vraies conditions.
 
@Elmoricq, je vais tester cette solution aussi, va falloir que j'adapte car la commande en question crache un peu de logs.
 
En tout cas merci, ca devrait bien m'aider, je vous tiens au jus.
++


Message édité par zoidberg le 22-06-2007 à 15:40:24
Reply

Marsh Posté le 22-06-2007 à 15:58:09    

Elmoricq a écrit :

Puisque la commande est très rapide, que tu es obligé de l'attendre et que tu dois impérativement récupérer son PID, je te propose d'utiliser "exec" à ton avantage.
 
En effet, 'exec' permet d'exécuter une commande en remplacement du processus courant.
Tu peux donc faire :

pid_commande=`echo $$ && exec /chemin/commande`



Je n'ai pas réussi à faire fonctionner (sous AIX 4.3 et 5.2) cette technique pourtant astucieuse au premier abord :
Mon script de test

echo "Pid=$$"
pid_c="$(echo $$ && ps -fu $USER >&2)"
echo "pid_c=$pid_c"


Le résultat:

Pid=13906
     UID   PID  PPID   C    STIME    TTY  TIME CMD
  gssjgu 13906 17676   1 15:46:38  pts/2  0:00 -ksh  
  gssjgu 15582 13906   2 15:46:38  pts/2  0:00 ps -fu gssjgu  
  gssjgu 17676 18238   0 10:39:08  pts/2  0:00 -ksh  
pid_c=13906


Le pid récupéré 13906 est celui du process exécutant mon shell, alors que le pid du process exécutant la commande ps est 15582 (avec pour ppid 13906).
 
J'ai essayé de remplacer

echo $$

par

eval echo \$\$

mais sans succés.
 
Jean-Pierre.
 

Reply

Marsh Posté le 22-06-2007 à 16:00:27    

Essaie avec :

pid_c="$(echo $$ && exec ps -fu $USER >&2)"

 

En fait, sans le exec, $() crée un sous-shell, et lancer un "ps" démarre le binaire en fils du shell.
Avec exec, $() crée un sous-shell, et lancer un "exec ps ..." démarre le binaire en remplacement du sous-shell, donc avec le même PID que ce dernier. ;)

 

edit : ah mince, je viens de capter ce que tu dis, un instant...

 

edit 2 : je propose ceci, qu'en penses-tu ?

pid_c=$(ksh -c 'echo $$ && exec ps -fu $USER')


Message édité par Elmoricq le 22-06-2007 à 16:08:03
Reply

Marsh Posté le 22-06-2007 à 16:15:56    

Comme ça c'est tout bon.
 
Jean-Pierre.

Reply

Sujets relatifs:

Leave a Replay

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