Détacher un processus Java du Shell

Détacher un processus Java du Shell - Java - Programmation

Marsh Posté le 16-11-2005 à 12:41:12    

Hello, j'aimerais faire comme dit ici, pour détacher son processus d'un shell on-the-fly: http://pezra.barelyenough.org/blog [...] va-daemon/ . Malheureusement, mon processus ne se détache pas du shell. Des idées ? Merci.
Test:
public class A
{
  public static void main(String[] args)
  {
    System.out.close();
    System.err.close();
    while(true)
    {
            try{Thread.sleep(50);}
            catch(Exception e) {}
    }
  }
}
 
Résultat:
$ java -cp . A
detaching...
 
Et ça rend pas la main. Testé sous debian.

Reply

Marsh Posté le 16-11-2005 à 12:41:12   

Reply

Marsh Posté le 16-11-2005 à 15:02:36    

Relis calmement ce que tu as écris, et tu verras que c'est une bête boucle infinie. Il n'y a rien dans ton code qui soit susceptible de "détacher" ton thread.
Relis bien aussi l'exemple qui est donné dans l'url, tu verras qu'il te manque des choses pour arriver à ce que tu veux, en particulier la méthode "daemonize".

Reply

Marsh Posté le 16-11-2005 à 15:04:27    

c'est joli tout ça mais c'est loin d'être assez, surtout avec les histoires de leader de session

Reply

Marsh Posté le 16-11-2005 à 15:08:19    

si t'utilise bash, j'utiliserais au moins
 
machin & disown

Reply

Marsh Posté le 17-11-2005 à 03:28:30    

J'ai bien tout lu post_it... et la fameuse méthode daemonize est composée uniquement des deux lignes qui ferment les flux de sortie du shell, celle qu'il ajoute ultérieurement ne fait qu'effacer le fichier contenant le pid à la fermeture de la jvm. Et OUI c'est une boucle infinie, c'est bien le but. Je pense que tu devrais lire la fameuse page.
Taz > dans l'exemple il n'utilise que &. En fait c'est sensé rendre la main lorsqu'il se détache du sous-shell dans le script (ici le vrai programme):


launch()
{
    /bin/sh << EOF
    $JYTHON -Ddaemon.pidfile=$PIDFILE $MAIN $PARAMS <&- &
    pid=\$!
    echo \${pid}
EOF
}
 
daemon_pid=`launch`
echo $daemon_pid


Mon problème est qu'il ne sort jamais de la procédure launch(), contrairement à ce qui est décrit dans la page, et le programme tourne bien et a bien appelé daemonize (il entre alors dans une boucle infinie sur un autre thread, faisant server xmlrpc). Alors oui j'utilise jython, mais ma méthode daemonize est ainsi:


    def daemonize(self):
        f = self.getPidFile()
        if f: f.deleteOnExit()
        System.out.close()
        System.err.close()
        sys.stdout.close()
        sys.stderr.close()


 
En ajoutant disown, ça ne change pas le résultat, il reste bloqué dans le sous-shell. Quand il est bloqué, depuis un autre shell:

$ ps -ef | grep java
g        32423 32422  1 10:20 pts/0    00:00:05 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32424 32423  0 10:20 pts/0    00:00:00 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32425 32424  0 10:20 pts/0    00:00:00 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32426 32424  0 10:20 pts/0    00:00:00 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32427 32424  0 10:20 pts/0    00:00:00 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32428 32424  0 10:20 pts/0    00:00:00 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32429 32424  0 10:20 pts/0    00:00:00 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32430 32424  0 10:20 pts/0    00:00:00 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32431 32424  0 10:20 pts/0    00:00:00 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32432 32424  0 10:21 pts/0    00:00:00 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32434 32424  0 10:21 pts/0    00:00:00 /usr/lib/j2sdk1.5-sun/jre/bin/ja
va -Dpython.home=/home/g/bin/jythonRelease_2_2alpha1 -classpath /home/g/bin/jyth
onRelease_2_2alpha1/jython.jar:/home/g/tmp/a/trunk/bin/genersys-builder.jar:/hom
e/g/tmp/a/trunk/lib/xmlrpc-2.0.jar:/home/g/tmp/a/trunk/lib/xstream-1.1.2.jar:/ho
me/g/tmp/a/trunk/lib/commons-codec-1.3.jar:/home/g/tmp/a/trunk/lib/xpp3-1.1.3.4d
_b4_min.jar:/home/g/tmp/a/trunk/lib/log4j-1.2.11.jar org.python.util.jython -Dda
emon.pidfile=/var/run/genersys-builder.pid /home/g/tmp/a/trunk/src/python/main.p
y -d
g        32450 32442  0 10:25 pts/1    00:00:00 grep java


Merci pour les réponses.

Reply

Marsh Posté le 17-11-2005 à 03:32:11    

Une autre précision: j'utilise & disown maintenant. Je le lance, il est bloqué, je le CTRL-C. Je regagne la main, et il est toujours actif. J'essaie de me délogger, et là ça bloque.

$ ./builder.sh -d
$ exit
logout


Et putty en reste là, sans se fermer. Le ps -ef sur l'autre shell me donne le processus toujours en train de tourner.
 
Edit: j'utilise effectivement bash, j'ai oublié de préciser.


Message édité par g012 le 17-11-2005 à 04:12:23
Reply

Marsh Posté le 17-11-2005 à 09:45:00    

et pourquoi pas faire un bête nohup ou mieux screen ?


---------------
get amaroK plugin
Reply

Marsh Posté le 17-11-2005 à 14:57:26    

Parce que nohup te détache immédiatement du parent et redirige les entrées sorties vers des fichiers. Je voudrais garder la main le temps que mon code d'initialisation soit finit, et seulement une fois que tout s'est bien passé passer en mode détaché. Mais bon si j'y arrive pas je vais bien finir par y passer avec un bête message dans le log quand ça plante. Quant à screen je connaissais pas, mais ça n'a pas l'air de répondre à ce besoin. Par contre ça a l'air bien sympa, merci de l'avoir mentionné :)

Reply

Marsh Posté le 18-11-2005 à 00:13:05    

normal, question de session leader ...

Reply

Marsh Posté le 18-11-2005 à 00:15:20    

je me quote à propos du double-fork
 

Citation :

c'est aussi parce que :
- le premier fork ça te permet de libérer le shell appelant
- tu te retrouves session leader
- donc ton process risque de reprendre le contrôle tu terme
- donc tu setsid et tu refork, et hop, pluis de problème

Reply

Sujets relatifs:

Leave a Replay

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