Как я запускаю абсолютно независимый процесс из программы Java?

Вполне возможно, что поддержка MySQL PDO отсутствует.

как root (или используя sudo):

apt-get install php5-mysql
50
задан Lawrence Dol 23 January 2010 в 13:04
поделиться

5 ответов

Это может помочь, если вы разместите тестовый раздел с минимальным кодом, необходимым для воспроизведения проблемы. Я протестировал следующий код в Windows и системе Linux.

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        Runtime.getRuntime().exec(args[0]);
    }
}

И протестировал со следующим кодом в Linux:

java -jar JustForTesting.jar /home/monceaux/Desktop/__TMP/test.sh

где test.sh выглядит так:

#!/bin/bash
ping -i 20 localhost

, а также этот код в Linux:

java -jar JustForTesting.jar gedit

И протестировал это на Windows:

java -jar JustForTesting.jar notepad.exe

Все они запустили свои намеченные программы, но приложение Java без проблем закрылось. У меня есть следующие версии JVM Sun, о которых сообщает java -version :

  • Windows: 1.6.0_13-b03
  • Linux: 1.6.0_10-b33

У меня не было шанса для тестирования на моем Mac еще. Возможно, в вашем проекте происходит какое-то взаимодействие с другим кодом, которое может быть неясным. Вы можете попробовать это тестовое приложение и посмотреть, каковы результаты.

18
ответ дан 7 November 2019 в 11:04
поделиться

Между вашими процессами существует отношение «родитель-потомок», и вы должны его разорвать. Для Windows вы можете попробовать:

Runtime.getRuntime().exec("cmd /c start editor.exe");

Для Linux кажется, что процесс все равно запускается отдельно, без необходимости в обновлении. Я пробовал это с gvim , midori и acroread .

import java.io.IOException;
public class Exec {
    public static void main(String[] args) {
        try {
            Runtime.getRuntime().exec("/usr/bin/acroread");
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Finished");
    }
}

Я думаю, что это невозможно с Runtime.exec независимо от платформы.

для POSIX-совместимой системы:

 Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", "your command"}).waitFor();
28
ответ дан 7 November 2019 в 11:04
поделиться

Вы хотите запустить программу в фоновом режиме и отделить ее от родительской. Я бы рассмотрел nohup (1) .

1
ответ дан 7 November 2019 в 11:04
поделиться

Я подозреваю, что для этого потребуется фактическая ветвь процесса. По сути, C-эквивалент того, что вы хотите:

pid_t id = fork();
if(id == 0)
  system(command_line);

Проблема в том, что вы не можете выполнить fork () на чистой Java. Я бы сделал следующее:

Thread t = new Thread(new Runnable()
{
    public void run()
    {
      try
      {
          Runtime.getRuntime().exec(command);
      }
      catch(IOException e)
      {           
          // Handle error.
          e.printStackTrace();
      }
    }
});
t.start();

Таким образом, JVM все равно не завершится, но графический интерфейс не останется, и останется только ограниченный объем памяти.

0
ответ дан 7 November 2019 в 11:04
поделиться

Один из способов, который я могу придумать, - это использовать Runtime.addShutdownHook для регистрации потока, который уничтожает все процессы (вам, конечно, нужно где-то сохранить объекты процесса).

Ловушка выключения вызывается только при выходе из JVM, поэтому она должна работать нормально.

Немного хакерский, но эффективный.

-1
ответ дан 7 November 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: