Как найти идентификатор процесса (pid) процесса, запущенного в java? [дубликат]
этот вопрос уже есть ответ здесь:
если я получу объект процесса в Java через Runtime.getRuntime().exec(...)
или ProcessBuilder.start()
, Я могу подождать его через Process.waitFor()
, что бы Thread.join()
, или я мог бы убить его Process.destroy()
, что похоже на устарел Thread.stop()
.
но: как найти pid объекта процесса? Я не вижу способа сделать это в Официальная Документация. Могу ли я сделать это на Java? Если да, то как?
5 ответов
этот парень кричит Башу, чтобы получить PID. Я не уверен, есть ли решение java для этой проблемы.
/**
* Gets a string representing the pid of this program - Java VM
*/
public static String getPid() throws IOException,InterruptedException {
Vector<String> commands=new Vector<String>();
commands.add("/bin/bash");
commands.add("-c");
commands.add("echo $PPID");
ProcessBuilder pb=new ProcessBuilder(commands);
Process pr=pb.start();
pr.waitFor();
if (pr.exitValue()==0) {
BufferedReader outReader=new BufferedReader(new InputStreamReader(pr.getInputStream()));
return outReader.readLine().trim();
} else {
System.out.println("Error while getting PID");
return "";
}
}
источник: http://www.coderanch.com/t/109334/Linux-UNIX/UNIX-process-ID-java-program
подобно другим упомянутым инструментам, есть jps
инструмент командной строки, который поставляется с Java runtime. Он выплевывает PIDs всех запущенных JVMs. Благо есть выход, нужно разобрать ограничивается только процессов JVM.
Лео, изучив эту проблему около недели, я думаю, что подход Jhurtado, вероятно, является" лучшим " подходом, которым мы можем управлять на Java прямо сейчас. "лучший" в кавычках, потому что он имеет очень неприятный побочный эффект в основном быть "догадкой" о том, что ваш ребенок PID.
Если ваше Java-приложение быстро порождает собственные процессы в системе с высокой нагрузкой, нет никакой гарантии, что PID, который вы забираете в своем расчете diff, является PID процесса, запущенного текущим Поток или что PID процесса, который вы выбираете, даже был порожден нашим приложением (возможно, хост-система уже запускала этот процесс в любом случае).
Это, как говорится, если вы не нерест десятки процессов или родной процесс вы нерест действительно уникален (некоторые пользовательские util вы грузите с приложением), то этот подход отлично работает в этом случае PID собственного процесса, который вы ищете является тот, который вы хотите.
в windows вы можете использовать'список задач' как отметил Jhurtado, чтобы получить полный список PIDs и фильтр для того, который вы хотите (использование переключателя фильтра /FI не сработало для меня в тестировании).
в любой системе * nix вы можете использовать "зы топор | команда grep "где имя-это имя процесса, например "nginx" или "httpd", которое вы хотите отфильтровать, чтобы получить свой список.
кроме того, если вам нужно убить бродячие процессы (например, на выходе VM) на *nix, вы можете, конечно, использовать"убить -9 " и на Windows, интересно, что вы можете использовать 'taskkill '.
к сожалению, вряд ли оптимальный.
я столкнулся с той же проблемой, что и вы. Я нашел довольно приличное решение, я рекомендую немного поспать, прежде чем он подумал, что процесс официально запущен.
Process p = Runtime.getRuntime().exec("cmd /c tasklist");
StringWriter writer = new StringWriter();
IOUtils.copy(p.getInputStream(), writer);
String theString = writer.toString();
//System.out.println(theString);
id = findLastString("javaw.exe .{1,} Console 1", theString);
System.out.println(id);
где findLastString определяется как
public static String findLastString(String pattern, String in) {
Pattern p = Pattern.compile(pattern);
Matcher matcher = p.matcher(in);
String it= "";
while(matcher.find()) {
it = matcher.group();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
int firstIndex=pattern.indexOf(".{1,}");
int lastIndex=it.substring(firstIndex).indexOf(pattern.substring(pattern.indexOf(".{1,}")+5))+firstIndex;
String dotOn = it.substring(pattern.indexOf(".{1,}"));
it=it.substring(firstIndex, lastIndex);
return it;
}
в основном это получит список запущенных процессов, и найти самый последний запущенный с, в этом случае, именем javaw.exe (моя программа запускала отдельный процесс java). Вы можете заменить javaw.exe с именем процесс, который вы можете найти с помощью Диспетчера задач. Вам также нужно будет получить Apache common IO jar.
Я думаю, что в Java ваш лучший выстрел, чтобы получить tasklist до и после нереста вашего дочернего процесса. Сделайте diff и получите свой PID.
вы можете получить Tasklist, выдав Runtime.getRuntime.exec("tasklist");
Обратите внимание, что tasklist.exe не входит в Windows XP Home edition, но все же вы можете скачать его.