Вполне возможно, что поддержка MySQL PDO отсутствует.
как root (или используя sudo):
apt-get install php5-mysql
Это может помочь, если вы разместите тестовый раздел с минимальным кодом, необходимым для воспроизведения проблемы. Я протестировал следующий код в 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
:
У меня не было шанса для тестирования на моем Mac еще. Возможно, в вашем проекте происходит какое-то взаимодействие с другим кодом, которое может быть неясным. Вы можете попробовать это тестовое приложение и посмотреть, каковы результаты.
Между вашими процессами существует отношение «родитель-потомок», и вы должны его разорвать. Для 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();
Вы хотите запустить программу в фоновом режиме и отделить ее от родительской. Я бы рассмотрел nohup (1) .
Я подозреваю, что для этого потребуется фактическая ветвь процесса. По сути, 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 все равно не завершится, но графический интерфейс не останется, и останется только ограниченный объем памяти.
Один из способов, который я могу придумать, - это использовать Runtime.addShutdownHook для регистрации потока, который уничтожает все процессы (вам, конечно, нужно где-то сохранить объекты процесса).
Ловушка выключения вызывается только при выходе из JVM, поэтому она должна работать нормально.
Немного хакерский, но эффективный.