Как найти идентификатор процесса (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, но все же вы можете скачать его.