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.
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.
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));
simpatico .. Mi chiedo perché questo non è pubblico? – Bozho
Buona domanda! E mi chiedo perché un tale bug sia aperto per oltre 10 anni senza risoluzione? –
Probabilmente perché Sun vuole che tu rimanga all'interno della JVM. –
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.
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
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.
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));
}
Ho trovato quel post prima, ma non mi va bene. Non riesco a preparare il programma di sottoprocesso di modifica che emetterebbe PID. – Pawka
String affido = "some_program" è meglio in questo caso – pstanton
Non è il codice vero e proprio. Solo un frammento per descrivere il problema. – Pawka