Récupèrer le numèro d'un processus sous linux

Récupèrer le numèro d'un processus sous linux - Shell/Batch - Programmation

Marsh Posté le 15-02-2010 à 17:06:51    

Salut a tous
 
Dans un script shell je lance cette commande /usr/local/bin/mysql2300 pour enregistrer des données météo dans une BDD mysql, jusqu'à là ça marche.
 
Mon problème c'est que le station météo a du mal à répondre ou si je la déconnecte du serveur, le cron se lance toutes les 5 minutes, les processus se lance en boucle et j'ai 200 processus et tous plante.
 
Je voudrais récupérer le numèro de processus /usr/local/bin/mysql230 quand il est lancer et faire un timeout au bout de 4m30s.
 
J'ai trouvé cette commande $$ et celle là $! mais ça ne renvoie pas le numèro de /usr/local/bin/mysql230 juste après que je l'ai lancé.
 
Comment je pourrais faire? auriez vous une idée? Merci

Reply

Marsh Posté le 15-02-2010 à 17:06:51   

Reply

Marsh Posté le 15-02-2010 à 20:49:24    

hppp a écrit :

J'ai trouvé cette commande $$ et celle là $! mais ça ne renvoie pas le numèro de /usr/local/bin/mysql230 juste après que je l'ai lancé.
 
Comment je pourrais faire? auriez vous une idée? Merci


 
$$ est une variable de script shell qui contient le n° du processus courant (donc associé au script en question) donc inutile ici
 
$! donne le dernier n° de processus lancé en arrière-plan => ça ne te donnera le n° de processus de mysql230 que si tu lances ce processus en background
Ex:

Code :
  1. #!/bin/sh
  2. /usr/local/bin/mysql230 &
  3. echo $!


 
Donc soit tu utilises cette méthode, soit tu récupères le pid de mysql230 en filtrant le résultat de ps

Code :
  1. ps -edf |grep mysql230


 

hppp a écrit :

Mon problème c'est que le station météo a du mal à répondre ou si je la déconnecte du serveur, le cron se lance toutes les 5 minutes, les processus se lance en boucle et j'ai 200 processus et tous plante.
 
Je voudrais récupérer le numèro de processus /usr/local/bin/mysql230 quand il est lancer et faire un timeout au bout de 4m30s.


Compliqué. Pourquoi tu ne fais pas un ping de ta station météo et tu ne lances mysql que si elle répond ???

Message cité 2 fois
Message édité par Sve@r le 15-02-2010 à 20:51:49

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 15-02-2010 à 21:01:52    

Sve@r a écrit :


Compliqué. Pourquoi tu ne fais pas un ping de ta station météo et tu ne lances mysql que si elle répond ???


un ping n'est pas forcément fiable : tu peux avoir une station météo qui répond au ping mais avec une latence de taré + pleins de données qui nécessiteront peut être plus de 5 min pour les récupérer

Reply

Marsh Posté le 15-02-2010 à 21:05:39    

hppp a écrit :

Salut a tous
 
Dans un script shell je lance cette commande /usr/local/bin/mysql2300 pour enregistrer des données météo dans une BDD mysql, jusqu'à là ça marche.
 
Mon problème c'est que le station météo a du mal à répondre ou si je la déconnecte du serveur, le cron se lance toutes les 5 minutes, les processus se lance en boucle et j'ai 200 processus et tous plante.
 
Je voudrais récupérer le numèro de processus /usr/local/bin/mysql230 quand il est lancer et faire un timeout au bout de 4m30s.
 
J'ai trouvé cette commande $$ et celle là $! mais ça ne renvoie pas le numèro de /usr/local/bin/mysql230 juste après que je l'ai lancé.
 
Comment je pourrais faire? auriez vous une idée? Merci


 
sous unix on aime bien mettre des flag d'exécution dans /var/run avec parfois le PID contenu dans le fichier
tu peux encapsuler l'appel de ta commande dans un script qui va créer un fichier (/var/run/stationmeteo.run) avec pour contenu le PID, et supprimer le fichier à la fin de l'exécution
 
il faudra également un test de contrôle pour ne pas lancer la commande si un fichier /var/run/stationmeteo.run existe (existence = process en cours d'exécution)
 
bien évidemment le revers de la médaille, c'est en cas de plantage inprévu ou de reboot sauvage de la machine

Reply

Marsh Posté le 15-02-2010 à 21:10:54    

ah oui encore une chose, évites de le mettre dans /var/run si tu n'as pas les droits et/ou si tu as un doute sur ce que tu fais et/ou si tu n'es pas seul sur la machine et/ou (liste non exhaustive)
 
si tu peux utiliser /usr/local/var/ ca peut être bien, sinon mets le ailleurs

Reply

Marsh Posté le 16-02-2010 à 08:12:10    

Sve@r a écrit :


 
$$ est une variable de script shell qui contient le n° du processus courant (donc associé au script en question) donc inutile ici
 
$! donne le dernier n° de processus lancé en arrière-plan => ça ne te donnera le n° de processus de mysql230 que si tu lances ce processus en background
Ex:

Code :
  1. #!/bin/sh
  2. /usr/local/bin/mysql230 &
  3. echo $!


 
Donc soit tu utilises cette méthode, soit tu récupères le pid de mysql230 en filtrant le résultat de ps

Code :
  1. ps -edf |grep mysql230


 


 

Sve@r a écrit :


Compliqué. Pourquoi tu ne fais pas un ping de ta station météo et tu ne lances mysql que si elle répond ???


 
Je peut pas faire de ping car la station météo est sur le port série du serveur.

Reply

Marsh Posté le 16-02-2010 à 20:18:10    

et si je fais un killall -9 mysql2300 ? c'est pas la solution?

Reply

Marsh Posté le 16-02-2010 à 23:23:23    

si, casser la vitre pour ouvrir la fenêtre en est également une autre

Reply

Marsh Posté le 24-02-2010 à 10:27:25    

hppp a écrit :

et si je fais un killall -9 mysql2300 ? c'est pas la solution?


 
Euh.... le kill ne fonctionne pas tout à fait comme ça : il te faut de toute façon le numéro du processus que tu veux flinguer :
 
NAME
     kill - terminate or signal processes
SYNOPSIS
     /usr/bin/kill -s signal_name pid...
     /usr/bin/kill -l [exit_status]
     /usr/bin/kill [-signal_name] pid...
     /usr/bin/kill [-signal_number] pid...
 
Donc il s'agit de trouver le numéro du processus que tu veux arrêter. Deux solutions : prévenir ou guérir.
Prévenir : un peu comme l'a justement suggéré Couak, encapsuler l'appel à ton binaire et buter ton processus après un délai X, avec un truc de ce genre :

Code :
  1. #!/bin/ksh
  2. /usr/local/bin/mysql2300 &
  3. PID_mysql2300=$!
  4. sleep 270 &# ton delai en secondes
  5. wait $!
  6. kill -9 ${PID_mysql2300} 2>&- # ferme la sortie des erreurs pour éviter de polluer la console dans le cas ou ton mysql2300 s'estt arrêté avant le kill
  7. exit 0


 
Attention, mon petit machin ci dessus ne te rend pas la main après le wait, il s'agit d'un bricolage vite fait à main levée.
 
Donc vois déjà si ce petit bidule fait ce que tu veux ? Y aura toujours moyen de l'améliorer après.
 
Sinon guérir : retrouver le PID de tes processus travaillant le binaire "mysql2300" et les tuer un par un à la main, avec un autre truc de ce genre :

Code :
  1. ps -e | grep mysql2300


ça, ça te permet de ne récupérer que les PID de tes binaires mysql2300
 
Après soit tu les tues à la main, soit tu fais une boucle (mais attention, tu as intérêt à vérifier le résultat du ps avant de lancer la boucle, sinon gare aux mauvaises surprises !!!)

Code :
  1. for PID in $( ps -e | grep mysql2300 | awk '{print $1;}' ); do kill -9 ${PID} 2>&-; done


Je redis, attention à cette commande, vérifie le résultat du ps avant de la lancer.
 
Voili voilouh


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
Reply

Marsh Posté le 24-02-2010 à 11:39:28    

pour tuer un process, pas besoin du pid: killall nom du process marche.


Message édité par Anonymouse le 24-02-2010 à 11:40:42
Reply

Marsh Posté le 24-02-2010 à 11:39:28   

Reply

Marsh Posté le 03-03-2010 à 14:02:40    

Oui, c'est sûr, sauf que si t'as 5 fois le même binaire lancé à des heures différentes... Marchera peut-être moins bien ? ou trop bien ?


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
Reply

Sujets relatifs:

Leave a Replay

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