Runtime exec в Linux

#java #linux #runtime #terminal #exec

#java #linux #среда выполнения #терминал #exec

Вопрос:

Я хочу запустить Java-программу (jar) в другом терминале в Linux. Вот мой код :

 import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.OutputStreamWriter;

public class Launcher
{
    public static void main(String[] args)
    {
            try
            {
                Thread.sleep(6000);
                Process p;

                if( System.getProperty("os.name").toLowerCase().contains("win") )
                {   
                    BufferedWriter bw;
                    p = Runtime.getRuntime().exec("cmd.exe /c start java -Xms512M -Xmx512M -jar craftbukkit.jar");
                    bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
                    bw.write(launcher   "rn");
                    bw.flush();
                }
                else
                {   
                    Runtime.getRuntime().exec(launcher);
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
        }
    }
}
  

В Windows проблем нет, jar запускается в другой консоли.
Но в Linux jar запускается в фоновом режиме, а не в другом терминале.

Спасибо за помощь!

Комментарии:

1. И вообще, что такое «другой терминал»? /dev/ttyN? Многие установки Linux выполняются без графического интерфейса пользователя.

2. Хм. Зависит от общей картины. Java улучшена, чтобы быть независимой от платформы. Ну, у вас может быть причина, по которой вам нужно что-то, зависящее от платформы. В этом случае я бы на самом деле разделил зависящий от платформы материал, например, в небольшой оболочке оболочки, и вызвал бы это, чтобы сделать его настраиваемым (один использует Konsole, другой Gnome terminal, другой eterm или xterm …). Но если бы я хотел сохранить способ Java, то есть зависящий от платформы, я бы попытался создать «терминал» на Java: передать stderr и stdin в какое-нибудь Java «window».

Ответ №1:

Это будет зависеть от дистрибутива Linux и выбранной пользователем среды рабочего стола.

Вам нужно выяснить, какой эмулятор консоли / терминала вы используете, просмотреть его параметры командной строки и найти тот, который позволяет вам указать команду для запуска. Например:

  • gnome-terminal -e "some command" выполняется some command в новой консоли, закрывая консоль при завершении выполнения команды.

  • gnome-terminal -e "bash -c "some command" ; sleep 10" запускается some command в новой консоли, ожидая 10 секунд перед закрытием.

Другие эмуляторы консоли / терминала, вероятно, будут делать это по-другому…

Последний шаг — использовать Runtime.exec(...) or ProcessBuilder и friends для сборки составной команды.

Комментарии:

1. … и не забывайте, что окружение рабочего стола может отсутствовать вообще.