2015-09-18 3 views
0

Я пытаюсь запустить и остановить службу Linux с Java. Я использую ProcessBuilder в соответствии с принятой практикой. Я построил следующий код (WebService является параметр, содержащий имя службы быть запущен):Запуск службы linux от Java

String[] commands = new String[6]; 

commands[0] = "/bin/sh"; 
commands[1] = "-c"; 
commands[2] = "sudo"; 
commands[3] = "service"; 
commands[4] = webService; 
commands[5] = "start"; 

ProcessBuilder processBuilder = new ProcessBuilder(commands); 

Process process = processBuilder.start(); 

int outcomeOfProcess = process.waitFor(); 

Это эффективно называет команду /bin/sh -c sudo service webService start. Который при запуске с терминала linux сервера работает отлично, но не работает с Java ProcessBuilder (resultOfProcess равен 1 при его запуске).

Я также пробовал sudo systemctl start webservice.service, но безрезультатно - и я также попытался вызвать скрипт bash, уже расположенный на машине linux, но это тоже не сработает.

Есть ли у кого-нибудь идеи, как это можно исправить?

+2

Установили ли вы пароль без sudo? Или как вы вводите пароль? – Biffen

+0

попробуйте запустить java-процесс с sudo, таким образом процесс будет работать с более высоким доступом и сможет запускать команды администратора, такие как 'sudo' –

+0

О, и не должно быть'/bin/sh -c 'sudo service webService start " ',? – Biffen

ответ

1

Не уверен ProcessBuilder может обрабатывать запросы SO. В тех случаях, мне нужно выполнять команды хозяина ОС (Windows/OSX/Linux и т.д ..), я использую Runtime.exec(String):

String command = "/bin/sh -c sudo service " + webService + " start"; 
Runtime.getRuntime().exec(command); 

Если вы хотите получить на выходе и ошибка выхода вы можете использовать Process и BufferedReader в described in this answer ,

public static void main(String args[]) { 
    String s; 
    Process p; 

    String command = "/bin/sh -c sudo service " + webService + " start"; 

    try { 
     // run the command 
     p = Runtime.getRuntime().exec(command); 
     BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     // get the result 
     while ((s = br.readLine()) != null) 
      System.out.println("line: " + s); 
     p.waitFor(); 
     // get the exit code 
     System.out.println ("exit: " + p.exitValue()); 
     p.destroy(); 
    } catch (Exception e) {} 
} 

Примечание: не эксперт Linux, так что я не могу сказать 100% командная строка является правильным, но да, вы можете выполнить его таким образом.

0

Проблема была в файле sudoers, который предотвратил выполнение кода без tty, с изменениями в этом файле, что означало, что он принимает код. Кошмар отлаживает это, поскольку он занял весь день! спасибо за все вход!