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

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

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

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

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

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

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

xvfb.terminate()

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

Ответы [ 2 ]

7 голосов
/ 01 апреля 2011

Я не знаю, почему вы хотите запустить 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).
1 голос
/ 01 апреля 2011

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

EDIT правильная командная строка -

sudo chmod u+s `which Xvfb` 
...