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

  FORUM HardWare.fr
  Programmation
  Java

  Détacher un processus Java du Shell

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Détacher un processus Java du Shell

n°1246685
g012
Posté le 16-11-2005 à 12:41:12  profilanswer
 

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.

mood
Publicité
Posté le 16-11-2005 à 12:41:12  profilanswer
 

n°1246798
post_it
Hmmmm!...
Posté le 16-11-2005 à 15:02:36  profilanswer
 

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".

n°1246800
Taz
bisounours-codeur
Posté le 16-11-2005 à 15:04:27  profilanswer
 

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

n°1246805
Taz
bisounours-codeur
Posté le 16-11-2005 à 15:08:19  profilanswer
 

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

n°1247296
g012
Posté le 17-11-2005 à 03:28:30  profilanswer
 

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.

n°1247298
g012
Posté le 17-11-2005 à 03:32:11  profilanswer
 

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
n°1247364
bobuse
Posté le 17-11-2005 à 09:45:00  profilanswer
 

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


---------------
get amaroK plugin
n°1247638
g012
Posté le 17-11-2005 à 14:57:26  profilanswer
 

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é :)

n°1248034
Taz
bisounours-codeur
Posté le 18-11-2005 à 00:13:05  profilanswer
 

normal, question de session leader ...

n°1248036
Taz
bisounours-codeur
Posté le 18-11-2005 à 00:15:20  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Détacher un processus Java du Shell

 

Sujets relatifs
[Shell] Diff de fichiers INIDessiner des Polygones en java, a partir de coordonnées en LateX
mettre des couleur sur le SHELL (linux)[java] debutant besoin d'aide pour interface graph
java et les processeurs 68 bitsBesoin d'aide pour traiter une image en java
Quel envirmt graphique pour génération auto source Java ???La compilation Java sous linux
[JAVA] faire un diff entre 2 fichierspb encodage java - Mysql
Plus de sujets relatifs à : Détacher un processus Java du Shell


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