Récupération de PID (bash/Solaris9)

Le
JKB
Bonjour à tous,

J'ai un petit problème Je dois modifier un script de lancement
(dans /etc/init.d) que j'ai écrit il y a quelque temps. La machine
tourne sous Solaris 9 et ce script comporte une ligne du type :

/usr/bin/su - $USER -c "(cd $DIR; ./$EXE > $0.log 2>&1 &)"

Je change d'utilisateur, je passe dans le répertoire DIR pour lancer
l'exécutables java EXE et rediriger ses sorties dans un fichier log.
Le problème : pour tuer le daemon, j'envoie un kill -15 qui est géré
par le daemon en question. Sauf que ps -eaf ne donne que le début de
la ligne de commande donc, ça coince à u nmoment où à un autre.
J'aimerais donc pouvoir récupérer le PID du processus détaché par
cette fameuse ligne de commande, mais je n'y arrive pas. Si je colle
un echo $! juste après elle, $! ne contient rien, forcément, la
commande est détachée par un su ! J'ai essayé de coller un echo
$! dans le su, mais là encore, cela ne renvoie rien. D'où la
question à 100 balles : comment récupérer ce #[||{[|~{[#(' d'ID de
processus dans une telle configuration ?

Merci de vos lumières,

JKB, qui sèche depuis quelques heures

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Thierry B.
Le #2791711
--{ JKB a plopé ceci: }--

/usr/bin/su - $USER -c "(cd $DIR; ./$EXE > $0.log 2>&1 &
echo $! > /var/run/pid.machin

)"


Euh, ça le fait pas un truc comme ça ?

question à 100 balles : comment récupérer ce #[||{[|~{[#(' d'ID de
processus dans une telle configuration ?


$ kill -42 $(cat /var/run/pid.machin)

--
Par pitié, évitez des débats "vi" vs "emacs" quand il s'agit de communication.
Le CULTe ne s'adresse pas à des geeks, mais à de vrai personnes !

Marc
Le #2791701
JKB wrote:

Bonjour à tous,

J'ai un petit problème... Je dois modifier un script de lancement
(dans /etc/init.d) que j'ai écrit il y a quelque temps. La machine
tourne sous Solaris 9 et ce script comporte une ligne du type :

/usr/bin/su - $USER -c "(cd $DIR; ./$EXE > $0.log 2>&1 &)"

Je change d'utilisateur, je passe dans le répertoire DIR pour lancer
l'exécutables java EXE et rediriger ses sorties dans un fichier log.
Le problème : pour tuer le daemon, j'envoie un kill -15 qui est géré
par le daemon en question. Sauf que ps -eaf ne donne que le début de
la ligne de commande donc, ça coince à u nmoment où à un autre.


Il me semble qu'il y a pargs pour avoir tous les arguments (sinon
/usr/ucb/ps marche très bien aussi).

J'aimerais donc pouvoir récupérer le PID du processus détaché par
cette fameuse ligne de commande, mais je n'y arrive pas. Si je colle
un echo $! juste après elle, $! ne contient rien, forcément, la
commande est détachée par un su !... J'ai essayé de coller un echo
$! dans le su, mais là encore, cela ne renvoie rien. D'où la


Le $! était-il bien protégé ? Chez moi ça marche s'il est entre ''.

JKB
Le #2794881
Le 11-04-2008, à propos de
Re: Récupération de PID (bash/Solaris9),
Thierry B. écrivait dans fr.comp.os.unix :
--{ JKB a plopé ceci: }--

/usr/bin/su - $USER -c "(cd $DIR; ./$EXE > $0.log 2>&1 &
echo $! > /var/run/pid.machin

)"


Euh, ça le fait pas un truc comme ça ?


Naon... Tu me connais, c'est le premier truc que j'ai essayé...
Comme le processus est lancé avec les droits de $USER, tu ne peux
pas écrire dans /var/run.

question à 100 balles : comment récupérer ce #[||{[|~{[#(' d'ID de
processus dans une telle configuration ?


$ kill -42 $(cat /var/run/pid.machin)


J'aime assez le signal 42... ;-)

JKB

PS: tiens, une signature pour toi...

--
Il ne faut pas confondre la coupe Davis et la boîte de Pandore.
-- JKB


JKB
Le #2794871
Le 11-04-2008, à propos de
Re: Récupération de PID (bash/Solaris9),
Marc écrivait dans fr.comp.os.unix :
JKB wrote:

Bonjour à tous,

J'ai un petit problème... Je dois modifier un script de lancement
(dans /etc/init.d) que j'ai écrit il y a quelque temps. La machine
tourne sous Solaris 9 et ce script comporte une ligne du type :

/usr/bin/su - $USER -c "(cd $DIR; ./$EXE > $0.log 2>&1 &)"

Je change d'utilisateur, je passe dans le répertoire DIR pour lancer
l'exécutables java EXE et rediriger ses sorties dans un fichier log.
Le problème : pour tuer le daemon, j'envoie un kill -15 qui est géré
par le daemon en question. Sauf que ps -eaf ne donne que le début de
la ligne de commande donc, ça coince à u nmoment où à un autre.


Il me semble qu'il y a pargs pour avoir tous les arguments (sinon
/usr/ucb/ps marche très bien aussi).


Non, il tronque aussi les lignes...

J'aimerais donc pouvoir récupérer le PID du processus détaché par
cette fameuse ligne de commande, mais je n'y arrive pas. Si je colle
un echo $! juste après elle, $! ne contient rien, forcément, la
commande est détachée par un su !... J'ai essayé de coller un echo
$! dans le su, mais là encore, cela ne renvoie rien. D'où la


Le $! était-il bien protégé ? Chez moi ça marche s'il est entre ''.


J'ai essayé aussi sans succès...

Merci tout de même,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.


JKB
Le #2796731
Le 11-04-2008, à propos de
Re: Récupération de PID (bash/Solaris9),
Loic Tortay écrivait dans fr.comp.os.unix :

J'ai un petit problème... Je dois modifier un script de lancement
(dans /etc/init.d) que j'ai écrit il y a quelque temps. La machine
tourne sous Solaris 9 et ce script comporte une ligne du type :

/usr/bin/su - $USER -c "(cd $DIR; ./$EXE > $0.log 2>&1 &)"

Je change d'utilisateur, je passe dans le répertoire DIR pour lancer
l'exécutables java EXE et rediriger ses sorties dans un fichier log.
Le problème : pour tuer le daemon, j'envoie un kill -15 qui est géré
par le daemon en question. Sauf que ps -eaf ne donne que le début de
la ligne de commande donc, ça coince à u nmoment où à un autre.

S'il n'y a pas plusieurs instances du même programme :

pkill -15 -U $USER $EXE
ou
pkill -15 -U $USER -f ./$EXE

On peut donner des options de sélection précises et multiples à "pkill"
(et "pgrep"), par exemple :
pkill -15 -P1 -U $USER -o -f ./$EXE
pour envoyer le signal 15 au plus ancien processus ('-o') dont la ligne de
commande contient "./$EXE" ('-f ./$EXE'), fils de '1' (-P1) et lancé par
l'utilisateur $USER ('-U $USER' : dont le euid est $USER).

Il faut bien sûr être $USER ou "root" pour que cela fonctionne.

Pas de pipe ni de race-condition et ça fonctionne sous Linux, Solaris,
les *BSD libres et sans doute d'autres OS (quelques options comme '-o'
peuvent manquer, en particulier sur certains BSDs).


J'ai aussi essayé ça sans résultat. En fait, pgrep compare la ligne
obtenue par ps (déjà tronqué) avec mon entrée, donc cela ne
fonctionne pas...

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.


Nicolas George
Le #2796721
JKB wrote in message
/usr/bin/su - $USER -c "(cd $DIR; ./$EXE > $0.log 2>&1 &)"


Tu ne peux pas corriger le ./$EXE en question pour qu'il ait un comportement
de démarrage moins bancal, genre qu'il écoute sur un FIFO de contrôle ? Ou
au moins qu'il note lui-même son PID quelque part ? À défaut, tu ne peux pas
remplacer ce système de lancement par un truc un peu plus fiable, genre un
supervise ou assimilé ?

JKB
Le #2796711
Le 11-04-2008, à propos de
Re: Récupération de PID (bash/Solaris9),
Nicolas George écrivait dans fr.comp.os.unix :
JKB wrote in message
/usr/bin/su - $USER -c "(cd $DIR; ./$EXE > $0.log 2>&1 &)"


Tu ne peux pas corriger le ./$EXE en question pour qu'il ait un comportement
de démarrage moins bancal, genre qu'il écoute sur un FIFO de contrôle ? Ou
au moins qu'il note lui-même son PID quelque part ? À défaut, tu ne peux pas
remplacer ce système de lancement par un truc un peu plus fiable, genre un
supervise ou assimilé ?


Non, je ne peux pas corriger simplement le truc en question.
J'ai simplement rajouté un wrapper qui lance le bout de programme ne
question en tâche de fond et qui me crache le PID dans un fichier
$0.pid que je relis.

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.


Thierry B.
Le #2837141
--{ JKB a plopé ceci: }--

/usr/bin/su - $USER -c "(cd $DIR; ./$EXE > $0.log 2>&1 &
echo $! > /var/run/pid.machin

)"


Euh, ça le fait pas un truc comme ça ?


Naon... Tu me connais, c'est le premier truc que j'ai essayé...
Comme le processus est lancé avec les droits de $USER, tu ne peux
pas écrire dans /var/run.


Ben alors faut écrire dans le home de $USER. Il doit forcément
exister un truc shell pour récupérer le path vers son home, non ?
Genre un petit coup de awk sur /etc/passwd... Ah mince, non, comme
tu es total complexe, faut probablement parser la sortie de ypcat
ou un truc du même genre...

J'aime assez le signal 42... ;-)


En fait, c'est pas POSIX, mais ça permet de controler la
génération des improbabilités.

--
La version UndeadBSD, si on n'est pas trop pinailleur sur la clause de
clonage des auteurs avec réplication mémorielle, est compatible, en
revanche. --{ SC, in fcol.debats }--



Thierry B.
Le #2837131
--{ JKB a plopé ceci: }--

Non, je ne peux pas corriger simplement le truc en question.


Ah ben oui, pas d'chance...

J'ai simplement rajouté un wrapper qui lance le bout de programme ne
question en tâche de fond et qui me crache le PID dans un fichier
$0.pid que je relis.


C'est pas trop demander que de te demander de donner plus de détails ?




--
P : Le mode active du pilote automatique provoque une descente de 200 pieds
par minute.
C : Probléme non reproductible au sol.

JKB
Le #2856661
Le 11-04-2008, à propos de
Re: Récupération de PID (bash/Solaris9),
Thierry B. écrivait dans fr.comp.os.unix :
--{ JKB a plopé ceci: }--

Non, je ne peux pas corriger simplement le truc en question.


Ah ben oui, pas d'chance...


Ouiaps, c'est du java qui utilise déjà stdout, stderr et plein
d'autres choses... Moi, quand c'est du Fortran, du C ou du RPL, ça
va, mais java, je ne peux pas ! ;-)

J'ai simplement rajouté un wrapper qui lance le bout de programme ne
question en tâche de fond et qui me crache le PID dans un fichier
$0.pid que je relis.


C'est pas trop demander que de te demander de donner plus de détails ?


Root lebegue:[/etc/init.d] > cat jcollab
#!/bin/bash
# Start/stop the jCollab server

PATH=/bin:/usr/bin

DIR=/home/jcollab/jcollab/server
EXE=serverJCollab
USER=jcollab
NAME=$(/bin/basename $0)

test -x $DIR/$EXE || exit 0

if test -f /var/run/$NAME.pid; then
PID=-1
else
PID=0
fi

function killexec
{
if test $PID -eq -1; then
for i in $(cat /var/run/$NAME.pid)
do
kill -15 $i;
done
fi

rm -f /var/run/$NAME.pid
}

case "$1" in
start) echo -n "Starting jCollab: server"
killexec
su - $USER -c "(cd $DIR; ./$EXE > $NAME.log 2>&1 &)" > /dev/null
2>&1
sleep 5
cat $DIR/$EXE.pid >> /var/run/$NAME.pid
rm -f $DIR/$EXE.pid
echo "."
;;

stop) echo -n "Stopping jCollab: server"
killexec
echo "."
;;

*) echo "Usage: /etc/init.d/jcollab start|stop"
exit 1
;;

esac
exit 0

et le wrapper :

Root lebegue:[/etc/init.d] > cat
/home/jcollab/jcollab/server/serverJCollab
#!/bin/bash

echo "Lancement du server : "
cd /home/jcollab/jcollab/server/plugins/new
for i in $(ls *.jar)
do
mv -f $i ..
done
cd /home/jcollab/jcollab/server/lib/new
for i in $(ls *.jar)
do
mv -f $i ..
done
cd /home/jcollab/jcollab/server

rm -f trace*

/opt/java/bin/java -Xms256m -Xmx768m -cp launcher.jar
com.systella.Framework.Server.launchServer &
echo $! > /home/jcollab/jcollab/server/serverJCollab.pid

exit 0

Voili, voilà...

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.


Publicité
Poster une réponse
Anonyme