Avatar billede skra Nybegynder
24. maj 2003 - 00:39 Der er 18 kommentarer og
1 løsning

Shell komando fra Java-program

Hej

Jeg kører et javaprogram i linux. Hvordan kan jeg i javaprogrammet skrive en kommando, der skal eksekveres i linux-shellen?

(ligesom command() i C eller PHPs metode, jeg ikek lige kan huske hvad hedder)

På forhånd tak.
Avatar billede bearhugx Nybegynder
24. maj 2003 - 00:42 #1
Du bruger getRuntime.exec( dinKommando );
Avatar billede bearhugx Nybegynder
24. maj 2003 - 00:43 #2
undskyld ... Runtime.getRuntime().exec( cmd );

så skulle den være på plads :-)
Avatar billede skra Nybegynder
24. maj 2003 - 00:44 #3
Mange tak. Tester lige, så kommer der points
Avatar billede bearhugx Nybegynder
24. maj 2003 - 00:46 #4
evt. slå op i din api under java.lang.Runtime - der er en liste over de måder, du bl.a. kan bruge exec() kommandoen på...
Avatar billede bearhugx Nybegynder
24. maj 2003 - 00:52 #6
loadet - hvad ville du foreslå - lave en Thread-wrapper-klasse, og foretage kaldet deri (så hovedtråden kan fortsætte med sit arbejde ? )
Avatar billede simonvalter Praktikant
24. maj 2003 - 00:54 #7
de giver faktisk svaret i linket
If you execute the program directly, you won't get any of the
shell-implemented substitutions, such as ~myself -> /home/myself,
or expansion of environment variables such as $PATH.  If you want
these to work, you'll have to exec() the shell itself, usually
"/bin/sh", passing the actual program you wish to run as an
option (-e, IIRC).
Avatar billede simonvalter Praktikant
24. maj 2003 - 00:54 #8
der står også noget mere lidt længere nede som jeg ikke fatter meget af ;)
Avatar billede bearhugx Nybegynder
24. maj 2003 - 01:01 #9
at de skriver, at ENV ikke kommer med, ved brug af exec() har jo ikke nogen påvirkning mht. om processen kan gå i deadlock - det betyder bare at variabler, som er sat i Enviroment (f.eks. PATH) ikke er tilgængelige

Hvad de skriver senere er dog mere interessant - især at exec() ikke fork'er en ny child-process - så hvis man har det ok med at ens java-program kører videre, mens en anden process udfører den ønskede shell-kommando, så kan opnå det ved at lave en Wrapper-klasse, som vil udføre ens shell-kommando i en selvstændig tråd...
Avatar billede bearhugx Nybegynder
24. maj 2003 - 01:02 #10
Men hvis man alligevel skal vente på resultatet af den shell-kommado (om det være sig retur-koden - eller at processen f.eks. skal opdatere/oprette en fil), så får man ikke meget ud af, at køre det i en ny process...
Avatar billede skra Nybegynder
24. maj 2003 - 01:02 #11
Og til at slutte af på:
Hvordan får jeg at se hvad min shell kommando returnerer?
Avatar billede simonvalter Praktikant
24. maj 2003 - 01:03 #12
jep .. pastede bare det der viste hvordan man gjorde det altså "/bin/sh -e program"
Avatar billede simonvalter Praktikant
24. maj 2003 - 01:07 #13
næ men om ikke andet kan man jo hoppe ind og kill -9 pid uden at hele progammet går i deadlock ;) eller hvordan man nu kan håndtere det
Avatar billede bearhugx Nybegynder
24. maj 2003 - 01:07 #14
Jeg mener du kan lytte på System.in
Avatar billede skra Nybegynder
24. maj 2003 - 01:10 #15
Runtime.getRuntime().exec("date");
System.out.println(System.in.read());

Giver intet output
Avatar billede bearhugx Nybegynder
24. maj 2003 - 01:19 #16
Det er ikke mit ekspertområde - Men noget siger mig, at du bliver nød til at lave en process (tråd) som lytter på System.in _mens_ dit program kører

Jeg har fundet et link, som måske kunne være til hjælp
http://archive.devx.com/upload/registered/features/javapro/1999/11nov99/tl1199/tl1199.asp
Avatar billede skra Nybegynder
24. maj 2003 - 01:21 #17
Det ser ud til at være det jeg har brug for. Tak skal i have.
Utroligt det ikke er gjort enklere i Java, når det er så enkelt i andre sprog.
Avatar billede bearhugx Nybegynder
24. maj 2003 - 01:26 #18
Det er sikkert også "enkelt nok" når man først kommer igang med det ... samtidig skal man jo huske, at Javas kommandoer til interaktion med det omliggende enviroment (kommandoprompt osv.) bliver nød til at foregå på en stykke-for-stykke metode, da alle operativsystemer (med alle deres forskelligheder) skal kunne understøttes... --- Og at køre en kommando og derefter læse dens output i konsollen bliver nød til at være to forskellige ting ... Der findes jo f.eks. operativsystemer som ikke naturligt har nogen konsol ....
Avatar billede simonvalter Praktikant
24. maj 2003 - 01:42 #19
den her virker

import java.io.*;
/**
* Created by IntelliJ IDEA.
* User: loadet
* Date: 24-05-2003
* Time: 01:35:57
* To change this template use Options | File Templates.
*/
public class bla {
    public static void main(String[] args) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec( "df" );

        p.waitFor();

        BufferedReader stdout = new BufferedReader( new InputStreamReader( p.getInputStream() ) );
        BufferedReader stderr = new BufferedReader( new InputStreamReader( p.getErrorStream() ) );

        while( stdout.ready() )
        {
            System.out.println(stdout.readLine());
        }

        while( stderr.ready() )
        {
            System.out.println(stderr.readLine());
        }

    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester