Leo, dopo aver esaminato questo problema per circa una settimana, penso che l'approccio di Jhurtado sia probabilmente l'approccio "migliore" che possiamo gestire in Java al momento. il termine "migliore" è tra virgolette perché ha il pessimo effetto collaterale di essere fondamentalmente una "supposizione" su quale sia il tuo PID figlio.
Se l'app Java sta generando rapidamente processi nativi in un sistema con carichi elevati, NON c'è garanzia che il PID prelevato nel calcolo di diff sia il PID del processo avviato dal thread corrente o che il PID del il processo che hai scelto è stato generato dalla nostra app (forse il sistema host stava già eseguendo comunque quel processo).
Detto questo, se non si generano dozzine di processi o il processo nativo che si sta generando è davvero unico (alcuni programmi personalizzati vengono forniti con l'app), questo approccio funziona correttamente, nel qual caso il PID del processo nativo stai cercando è quello che vuoi.
Su Windows si può usare 'tasklist' come Jhurtado sottolineato per ottenere l'elenco completo dei PID e filtrare per quello che si desidera (utilizzando l'interruttore del filtro/FI non ha funzionato per me in fase di test).
Su qualsiasi sistema * nix è possibile utilizzare "ps ax | grep" dove NOME è un nome di processo come "nginx" o "httpd" che si desidera filtrare per ottenere l'elenco.
Inoltre, se avete bisogno di uccidere i processi randagi (ad esempio, all'uscita VM) su * nix è possibile l'uso di corso "kill -9" e su Windows, abbastanza interessante, è possibile utilizzare 'taskkill '.
Purtroppo non ottimale.
fonte
2011-08-16 01:54:29
Penso che questo darà il pid del processo JVM ... non il processo generato da Java che credo sia quello che la domanda si pone. – splashout
Penso che tu abbia bisogno di leggere un po 'più vicino. Genera un processo in cui solo il lavoro deve far risuonare il proprio PID sul proprio stdout, che a sua volta sta collegando il descrittore del file stdin associato alla JVM. – nsfyn55
I vettori sono vecchi e sincronizzati - non è necessario utilizzare quel tipo di raccolta - prova invece a utilizzare un ArrayList. Sto solo dicendo – user924272