2009-12-13 11 views
12

Sto creando sottoprocessi in questo modo:Get sottoprocesso id in Java

String command = new String("some_program"); 

Process p = Runtime.getRuntime().exec(command); 

Come posso ottenere che il sottoprocesso id?

P.S. Sto lavorando su Linux.

+0

String affido = "some_program" è meglio in questo caso – pstanton

+0

Non è il codice vero e proprio. Solo un frammento per descrivere il problema. – Pawka

risposta

27

Non è ancora disponibile alcuna API pubblica (vedere http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4244896) ma esistono soluzioni alternative.

Una prima soluzione potrebbe essere quella di utilizzare un programma esterno come ps e chiamare utilizzando Runtime.exec() per ottenere il pid :)

Un altro si basa sul fatto che la classe java.lang.Process è astratta e che è effettivamente ottenere una sottoclasse concreta a seconda della piattaforma. Su Linux, avrai un java.lang.UnixProcess che ha un campo privato int pid. Utilizzando riflessione, si può facilmente ottenere il valore di questo campo:

Field f = p.getClass().getDeclaredField("pid"); 
f.setAccessible(true); 
System.out.println(f.get(p)); 
+0

simpatico .. Mi chiedo perché questo non è pubblico? – Bozho

+0

Buona domanda! E mi chiedo perché un tale bug sia aperto per oltre 10 anni senza risoluzione? –

+3

Probabilmente perché Sun vuole che tu rimanga all'interno della JVM. –

1

Ho provato (e fallito) a farlo un po 'di tempo fa. Ho finito con il wrapping del mio comando in uno script di shell che ha scaricato il pid in un file. Non è la soluzione migliore ma mi ha superato questo ostacolo.

+0

Questa era la prima idea, quello che pensavo. Ma non mi va bene. Il "comando" potrebbe essere quasi qualsiasi programma, non preparato dal mio. Comunque. – Pawka

1

Bene, non esiste un modo documentato per eseguire questa operazione, ma accade che la classe di implementazione del processo sia UNIXProcess e che disponga di un campo PID. Quindi puoi usare reflection per accedere a questo campo privato per ottenere l'ID. Su Google puoi trovare altri trucchi per chiamare un'altra shell per ottenere l'output ps e quel tipo di cosa. Niente di facile.

1

Da here

public static void main(String[] args) throws IOException { 
    byte[] bo = new byte[100]; 
    String[] cmd = {"bash", "-c", "echo $PPID"}; 
    Process p = Runtime.getRuntime().exec(cmd); 
    p.getInputStream().read(bo); 
    System.out.println(new String(bo)); 
} 
+0

Ho trovato quel post prima, ma non mi va bene. Non riesco a preparare il programma di sottoprocesso di modifica che emetterebbe PID. – Pawka