Подтвердить что ты не робот

Как найти идентификатор процесса (pid) процесса, запущенного в java?

Если я получаю объект процесса в Java через Runtime.getRuntime().exec(...) или ProcessBuilder.start(), я могу дождаться его через Process.waitFor(), что похоже на Thread.join(), или я мог бы убить его с помощью Process.destroy(), что как устаревший Thread.stop().

НО: Как найти pid объекта процесса? Я не вижу метода для этого в Официальная документация. Могу ли я сделать это на Java? Если да, то как?

4b9b3361

Ответ 1

Этот парень звонит bash, чтобы получить 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

Ответ 2

Как и в других упомянутых инструментах, есть инструмент командной строки jps, который поставляется со средой выполнения Java. Он выплевывает PID всех запущенных JVM. Преимущество - результат, который нужно проанализировать, ограничивается только процессами JVM.

Ответ 3

Лео, посмотрев этот вопрос примерно на неделю, я думаю, что подход Jhurtado, скорее всего, является "лучшим" подходом, который мы можем управлять в Java прямо сейчас. "лучше" в кавычках, потому что у него очень неприятный побочный эффект, в основном, "предположение" о том, что такое ваш ПИД-регулятор вашего ребенка.

Если ваше Java-приложение быстро запускает собственные процессы в высоконагруженной системе, нет НИКАКИХ гарантий, что PID, который вы выбрали при вычислении diff, является PID процесса, запущенного текущим потоком, или что PID процесса вы выбрали даже порожденное нашим приложением (возможно, хост-система уже выполняла этот процесс).

Говоря, что если вы не создаете десятки процессов или собственный процесс, который вы создаете, действительно уникальны (некоторые пользовательские используют, вы отправляете с вашим приложением), тогда этот подход отлично работает, и в этом случае PID собственного процесса вы ищут тот, который вам нужен.

В окнах вы можете использовать " список задач", как указал Jhurtado, чтобы получить полный список PID и фильтр для того, который вы хотите (с помощью переключателя фильтра FI не работал у меня в тестирование).

В любой системе * nix вы можете использовать " ps ax | grep", где NAME - это какое-то имя процесса, например "nginx" или "httpd", которое вы хотите отфильтровать, чтобы получить список.

Кроме того, если вам нужно убить случайные процессы (например, на выходе VM) на * nix, вы можете, конечно, использовать " kill -9" и в Windows, что интересно, вы можете использовать ' taskkill.

К сожалению, вряд ли оптимально.

Ответ 4

Я столкнулся с той же проблемой, что и вы. Я нашел довольно приличное решение, я рекомендую легкий сон, прежде чем он подумает, чтобы процесс был официально запущен.

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 на имя процесса, который вы можете найти, используя диспетчер задач. Вам также понадобится собрать барабан IOI Apache.

Ответ 5

Я думаю, что в Java ваш лучший снимок - получить tasklist до и после нереста вашего дочернего процесса. Сделайте diff и получите свой PID.

вы можете получить список задач, выпустив Runtime.getRuntime.exec("tasklist");
Обратите внимание, что tasklist.exe не входит в комплект Windows XP Home Edition, но вы можете его загрузить.