Запуск subprocess.run от имени пользователя root не работает

Я пытаюсь убить подпроцесс через его pid, используя для этого subprocess.call(). Я получаю pid, назначая return такому значению:

return = subprocess.Popen(["sudo", "scrolling-text-example", "-y7"]) 
x= return.pid

Когда я готов завершить этот подпроцесс, я использую этот код:

subprocess.call(["sudo","kill",str(x)])

Это не убивает подпроцесс, но если я открою терминал (скажем, x равно 1234) и наберу: sudo kill 1234 , он убьет подпроцесс.


person ProgrammerBret    schedule 28.02.2020    source источник
comment
Насколько я знаю, вы должны сделать «sudo kill -9 1234».   -  person new QOpenGLWidget    schedule 28.02.2020
comment
Приближаемся, но теперь ошибка говорит FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'sudo kill 1853': 'sudo kill -9 1853'   -  person ProgrammerBret    schedule 28.02.2020
comment
Я думаю, что он не считает str(x) строкой.   -  person new QOpenGLWidget    schedule 28.02.2020
comment
На самом деле я изменил его на killCmd = "sudo kill %s" %x, а затем на subprocess.run(killCmd), чтобы проверить это, и я получаю то же сообщение.   -  person ProgrammerBret    schedule 28.02.2020
comment
Попробуйте x = str(return.pid)   -  person new QOpenGLWidget    schedule 28.02.2020
comment
Я сделал это -- x = str(return.pid) и запуск subprocess.call(["sudo","kill",x]) ничего не дает -- я думаю, что мне нужны привилегии root для этой папки, в которой я работаю -- сейчас я ищу, как это сделать..   -  person ProgrammerBret    schedule 28.02.2020
comment
Попробуйте это.   -  person new QOpenGLWidget    schedule 28.02.2020


Ответы (2)


Используйте x = str(return pid) и subprocess.call(["sudo","kill","-9",x]), а затем попробуйте предоставить привилегии root. И это позволяет преобразовать номер процесса в строку перед вызовом подпроцесса. Кроме того, как я уже говорил, используйте -9 (или -15, если хотите). (Попробуйте также убить процесс 1014).

person new QOpenGLWidget    schedule 28.02.2020
comment
К сожалению, это не сработало. Однако я сделал ps -e --forest для просмотра отношений и получил это: 1009 ? 00:00:00 | \_ sudo 1014 ? 00:00:04 | \_ scrolling-text- Таким образом, этим были запущены два процесса. Похоже, что процесс scrolling-text- является дочерним по отношению к процесс sudo, который возвращает x, то есть 1009 - person ProgrammerBret; 28.02.2020
comment
ОБНОВЛЕНИЕ -- я обнаружил, что этот код убивает процесс 1009, но не процесс 1014 -- поэтому мне нужно убить ОБА, так как 1014 зависит - person ProgrammerBret; 28.02.2020

Я обнаружил, что основной процесс, который я идентифицирую с помощью x = return.pid, на самом деле запускает дочерний процесс, который мне нужно было убить, поэтому из указанного родительского процесса нам нужно убить дочерний процесс. В этой ситуации добавление «-P» включает дочерние процессы. Мне нужна следующая структура команды:

subprocess.call(["sudo","pkill","-9","-P",x])
person ProgrammerBret    schedule 02.03.2020