Как запустить и остановить программу Linux, используя модуль подпроцесса в Python?

Я пишу веб-приложение, которое использует Selenium для экранирования другого веб-сайта. Этот скрипинг экрана происходит только один раз в день, поэтому я бы не оставил Selenium и Xvfb все время.

Я пытаюсь выяснить, как запустить Xvfb и Selenium из Python, а затем остановить их, как только очистка экрана будет выполнена.

Если бы я делал это вручную, я бы начал их в командной строке и ударил CTRL C, чтобы остановить их. Я пытаюсь сделать то же самое с Python.

Кажется, я могу успешно запустить Xvfb следующим образом:

xvfb = Popen('Xvfb :99 -nolisten tcp', shell=True) 

Но когда я пытался его прекратить:

 xvfb.terminate() 

и затем попытался запустить его снова (повторяя мою первоначальную команду), он говорит мне, что он уже запущен.

2 Solutions collect form web for “Как запустить и остановить программу Linux, используя модуль подпроцесса в Python?”

Я не знаю, почему вы хотите запустить Xvfb как root. Ваш обычный X-сервер должен запускаться только как root (для многих, но не для всех устройств) только для доступа к видеооборудованию; это не проблема для Xvfb по определению.

 tempdir = tempfile.mkdtemp() xvfb = subprocess.Popen(['Xvfb', ':99', '-nolisten', 'tcp', '-fbdir', tempdir]) 

Когда вы завершаете X-сервер, вы можете увидеть процесс зомби . Это фактически не процесс (он мертв), просто запись в таблице процессов, которая уходит, когда родительский процесс либо считывает статус выхода ребенка, либо сам умирает. Зомби в основном безвредны, но чистить, чтобы вызвать wait чтобы прочитать статус выхода.

 xvfb.terminate() # At this point, `ps -C Xvfb` may still show a running process # (because signal delivery is asynchronous) or a zombie. xvfb.wait() # Now the child is dead and reaped (assuming it didn't catch SIGTERM). 

Я предполагаю, что вы можете параметризовать свою систему, чтобы позволить любому пользователю запускать Xvfb, как описано здесь, чтобы решить все ваши проблемы

ИЗМЕНИТЬ правильную командную строку

 sudo chmod u+s `which Xvfb` 
Python - лучший язык программирования в мире.