IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Lancer Process Linux


Sujet :

Java

  1. #1
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut Lancer Process Linux
    Bonjour,

    Je souhaite exécuter une commande bash en Java. (import d'un shapefile dans une base de données postgis).

    Pour cela je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Process process = null;
    try {
    	String commande = "shp2pgsql -p /tmp/MYSHP myschema.mytable > /tmp/mytable.sql";
    	System.out.println("COMMANDE = "+commande);
    	process = Runtime.getRuntime().exec(commande);
    	followUp(process);
    } 
    catch (IOException e) {
    	System.out.println("PB creation");
    	if(process != null)
    		process.destroy();
    	throw e;
    }
     
    private void followUp(Process process) throws IOException {
    	InputStream inputstream = process.getInputStream();
    	InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
    	BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
    	System.out.println("bufferedreader : "+bufferedreader);
    	String line = bufferedreader.readLine();
    	System.out.println(line);
    	while (line != null) {
    		System.out.println(line);
    		line = bufferedreader.readLine();
    	}
    }
    Si je copie/colle la commande dans une console ça fontionne.
    J'ai essayé de mettre le chemin complet vers l'exécutable (/./usr/local/pgsql/data/bin/shp2pgsql) mais ça ne change rien.

    Le process n'est pas null et aucune erreur n'est remontée mais le bufferedreader.readLine() l'est.

    Merci de votre aide !
    WwAve

  2. #2
    Membre chevronné
    Avatar de Anthony.Desvernois
    Homme Profil pro
    Ingénieur sécurité & risque
    Inscrit en
    Juin 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité & risque
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 489
    Points : 2 244
    Points
    2 244
    Par défaut
    Et que donnes la commande "/bin/bash tonscript" (dans le java hein). Parce que ça m'étonnerais que java interprete les shebang

  3. #3
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut
    Hello !

    Si ma commande est maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String commande = "/bin/bash shp2pgsql -p /tmp/MYSHP myschema.mytable > /tmp/mytable.sql";
    ça ne change rien...

  4. #4
    Membre chevronné
    Avatar de Anthony.Desvernois
    Homme Profil pro
    Ingénieur sécurité & risque
    Inscrit en
    Juin 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité & risque
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 489
    Points : 2 244
    Points
    2 244
    Par défaut
    Sinon il y a la classe ProcessBuilder (http://java.sun.com/j2se/1.5.0/docs/...ssBuilder.html) qui semble plus appropriée.

  5. #5
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut
    Bon j'ai un peu tout essayé avec le ProcessBuilder :

    String commande = "shp2pgsql -p /tmp/MYSHP myschema.mytable > /tmp/mytable.sql";
    String commande = "/./usr/local/pgsql/bin/shp2pgsql -p /tmp/MYSHP myschema.mytable > /tmp/mytable.sql";
    String commande = "/bin/bash shp2pgsql -p /tmp/MYSHP myschema.mytable > /tmp/mytable.sql";

    Mais j'ai toujours la même erreur :
    java.io.IOException: java.io.IOException: /bin/bash shp2pgsql -p /tmp/AAA012 test_import.aaa012 | psql -d envol_db -U envol: not found
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
    at java.lang.ProcessImpl.start(ProcessImpl.java:65)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java :451)
    ...
    ... c'est bien compliqué mais au moins avec le ProcessBuilder ça a l'air de lancer quelque chose !...

  6. #6
    Membre chevronné
    Avatar de Anthony.Desvernois
    Homme Profil pro
    Ingénieur sécurité & risque
    Inscrit en
    Juin 2007
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité & risque
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 489
    Points : 2 244
    Points
    2 244
    Par défaut
    Les pipes et les redirections, il ne les comprend pas Mais tu peux t'en sortir en consultant la manpage de bash.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Attention, la méthode exec() ne s'invoque pas de cette manière.
    Elle est en train de considérer que l'exécutable que tu cherches est
    shp2pgsql -p /tmp/MYSHP myschema.mytable > /tmp/mytable.sql
    avec les arguments et tout...

    Dans ton cas, l'exécutable est shp2pgsql et les arguments sont -p, /tmp/MYSHP, myschema.mytable.

    L'appel devrait donc plus ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec(new String[]{"shp2pgsql", "-p", "/tmp/MYSHP", "myschema.mytable"});
    Je ne suis pas sûr qu'on puisse mettre le > /tmp/mytable.sql comme argument, mais tu peux essayer.

    Si tu veux utiliser ProcessBuilder, le concept est le même.

    Bon courage.

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par feuxeu77 Voir le message
    Attention, la méthode exec() ne s'invoque pas de cette manière.
    exec() peut s'utiliser comme cela, mais la découpe des paramètres peut différer de celle du shell standard. Il est donc préférable d'utiliser la version avec un tableau de String où chaque élément correspond bien à un paramètre...

    Citation Envoyé par feuxeu77 Voir le message
    Je ne suis pas sûr qu'on puisse mettre le > /tmp/mytable.sql comme argument, mais tu peux essayer.
    Non : c'est le shell qui interprète cela. Soit tu redirige toi même, soit tu appelles le shell avec toute la ligne de commande...


    Plus d'info :
    a++

  9. #9
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut
    Rien n'y fait.... Je viens de tout essayé (avec le ProcessBuilder).

    Si c'est dans une String ou dans un tableau de String :
    shp2pgsql
    /usr/local/pgsql/bin/shp2pgsql
    /./usr/local/pgsql/bin/shp2pgsql
    /bin/bash /usr/local/pgsql/bin/shp2pgsql
    /bin/bash /./usr/local/pgsql/bin/shp2pgsql
    /bin/bash shp2pgsql

    GRRRRRR !
    Je ne comprends vraiment pas pourquoi ça ne fonctionne pas....

  10. #10
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut
    J'AI TROUVé !!!!!

    String[] cmd = new String[size];
    cmd[i++] = "/bin/sh";
    cmd[i++] = "-c";
    cmd[i++] = "shp2pgsql .........";

    process = new ProcessBuilder(cmd).start();

    Merci de votre aide !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Arreter un process Linux
    Par marouene_ dans le forum Linux
    Réponses: 13
    Dernier message: 25/10/2011, 10h06
  2. difficultés avec "lancer process externe"
    Par homech dans le forum 4D
    Réponses: 1
    Dernier message: 22/07/2009, 14h50
  3. Réponses: 6
    Dernier message: 15/01/2008, 09h22
  4. Lancer process externe
    Par meischuh dans le forum 4D
    Réponses: 8
    Dernier message: 27/07/2007, 10h17
  5. thread java et process linux
    Par blured dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 27/06/2007, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo