Récupèrer le numèro d'un processus sous linux - Shell/Batch - Programmation
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é. |
$$ 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 :
|
Donc soit tu utilises cette méthode, soit tu récupères le pid de mysql230 en filtrant le résultat de ps
Code :
|
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. |
Compliqué. Pourquoi tu ne fais pas un ping de ta station météo et tu ne lances mysql que si elle répond ???
Marsh Posté le 15-02-2010 à 21:01:52
Sve@r a écrit : |
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
Marsh Posté le 15-02-2010 à 21:05:39
hppp a écrit : Salut a tous |
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
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
Marsh Posté le 16-02-2010 à 08:12:10
Sve@r a écrit :
|
Sve@r a écrit : |
Je peut pas faire de ping car la station météo est sur le port série du serveur.
Marsh Posté le 16-02-2010 à 20:18:10
ReplyMarsh Posté le 16-02-2010 à 23:23:23
si, casser la vitre pour ouvrir la fenêtre en est également une autre
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 :
|
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 :
|
ç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 :
|
Je redis, attention à cette commande, vérifie le résultat du ps avant de la lancer.
Voili voilouh
Marsh Posté le 24-02-2010 à 11:39:28
pour tuer un process, pas besoin du pid: killall nom du process marche.
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 ?
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