Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1290 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1966180
hppp
Serveur@home
Posté le 15-02-2010 à 17:06:51  profilanswer
 

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

mood
Publicité
Posté le 15-02-2010 à 17:06:51  profilanswer
 

n°1966305
Sve@r
Posté le 15-02-2010 à 20:49:24  profilanswer
 

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.
n°1966312
couak
Posté le 15-02-2010 à 21:01:52  profilanswer
 

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

n°1966314
couak
Posté le 15-02-2010 à 21:05:39  profilanswer
 

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

n°1966316
couak
Posté le 15-02-2010 à 21:10:54  profilanswer
 

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

n°1966377
hppp
Serveur@home
Posté le 16-02-2010 à 08:12:10  profilanswer
 

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.

n°1966619
hppp
Serveur@home
Posté le 16-02-2010 à 20:18:10  profilanswer
 

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

n°1966672
couak
Posté le 16-02-2010 à 23:23:23  profilanswer
 

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

n°1968785
Kerrozen
To be or not to be ... cool ..
Posté le 24-02-2010 à 10:27:25  profilanswer
 

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 !
n°1968844
Anonymouse
Posté le 24-02-2010 à 11:39:28  profilanswer
 

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


Message édité par Anonymouse le 24-02-2010 à 11:40:42
mood
Publicité
Posté le 24-02-2010 à 11:39:28  profilanswer
 

n°1970847
Kerrozen
To be or not to be ... cool ..
Posté le 03-03-2010 à 14:02:40  profilanswer
 

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 !

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 

Sujets relatifs
recuperer un parametre d'un form multipartrecuperer une police d une calculatrice
[VBA] Récupérer le nombre de pages d'une feuilleCommunication inter-processus
recuperer le nb de frames d'un flvScript pour recuperer des données dans une page .htm
Récupérer une largeur d'image ?récupérer les variables PHP dans un symbole flash (AS 2)
Recuperer header d'une image rapidementRécupérer un fichier indépendamment de la casse de son extension
Plus de sujets relatifs à : Récupèrer le numèro d'un processus sous linux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR