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

Я разрабатываю приложение, которое должно запускать команду от имени пользователя 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 ответа

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

На своем 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

Добавьте это в том месте, где вы хотите, чтобы был издан сигнал 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. Примите ответ, если он сработал для вас. Дайте мне знать в комментариях, если у вас возникли проблемы.

Другие вопросы по тегам