Отправить Control-C процессу, выполняемому через Runtime.getRuntime (). Exec ("su"); - PullRequest
3 голосов
/ 22 февраля 2011

Я разрабатываю приложение, которое должно запускать команду от имени пользователя root, поэтому я использую:

process = Runtime.getRuntime().exec("su");

Затем запускаю процесс с:

os = new DataOutputStream(process.getOutputStream());

os.writeBytes("tcpdump\n");

Когда мне нужнопроцесс до os.writeBytes("exit\n"); не работает, а process.waitFor(); get заблокирован и процесс не завершается.Мне нужно отправить Control-C процессу, чтобы остановить его, но я не знаю, как мне это сделать.

Спасибо.

Ответы [ 3 ]

1 голос
/ 21 января 2013

На своем github Chainfire предоставляет пример реализации класса Shell, который можно использовать для выполнения команд от имени пользователя root. Класс обрабатывает все задачи, используя Threads, поэтому вы можете быть уверены, что команда не будет блокироваться, даже если она не вернется.

Фрагмент кода:

if(Shell.SU.available()){
   Shell.SU.run("commandAsRoot"); //Command executed as root
else{
   System.out.println("su not found");

Или, если вы уверены , что двоичный файл su доступен, вы можете просто запустить свои команды (закомментированную строку) и пропустить проверку.

Источник: How-To SU

1 голос
/ 22 февраля 2011

Узнайте, есть ли у API метод kill (), и используйте этот метод для отправки сигнала SIGINT целевому процессу.

0 голосов
/ 18 августа 2014

Добавьте это в то место, куда вы хотите подать сигнал ctrl-c.

Process interrupt = Runtime.getRuntime().exec("su");
ios = new DataOutputStream(interrupt.getOutputStream());

ios.writeBytes("pkill -SIGINT tcpdump");
ios.flush();
ios.close();
interrupt.waitFor();

Если есть несколько процессов, выполняющихся с именем tcpdump, и вам нужно быть избирательным, выясните идентификатор конкретного процесса с помощью команд pidof и grep. Примите ответ, если он работал на вас. Дайте мне знать в комментариях, если у вас возникли проблемы.

...