2014-10-20 4 views
0

У меня есть сценарийубить фоновый процесс, выполняемый питоном

import os 
os.system('python manage.py runserver') 

Скрипт запускается сервер Джанго (независимо от того, что он делает, он не может быть любой командой, которая не оценивает до ctrl+c или другого сочетания клавиша нажата).

Я хочу остановить сервер каким-либо образом, но не убить его pid.


Что я пробовал:

Я пытался использовать subprocess LIB и это kill команда, как описано здесь: How to terminate a python subprocess launched with shell=True

Но это не помогает. Как я думаю, причина в том, что мы убиваем не процесс manage.py runserver, а процесс, который оценивает python manage.py runserver. Итак, после процесса убийства сервер все еще работает.

Также я пытался использовать terminate метод:

p = subprocess.Popen('python manage.py runserver', stdout=subprocess.PIPE, shell=True) 
time.sleep(5) 
p.terminate() 

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

Есть ли способ убить процесс?

+1

Вы создали новую группу процессов в качестве ответа от вопроса, который вы связали, рекомендует? 'runningerver' не демонизирует серверный процесс, поэтому рецепт должен работать. – jfs

+2

не используйте 'stdout = PIPE', если вы не читаете из трубы. Используйте [DEVNULL вместо этого, если вы хотите отменить вывод] (http://stackoverflow.com/q/11269575/4279) – jfs

+0

Большое вам спасибо! Я только что попробовал повторить ответ из вопроса, который я связал, и ... все работает. Я не знаю, почему он не работал в первый раз, но теперь он делает именно то, что я хочу. Спасибо за то, что вы снова указали мне на этот вопрос и поблагодарили за DENVULL (нежелательный результат был моей второй проблемой). – imkost

ответ

2

Это звучит сомнительно. Пожалуйста, не делайте этого!

Django рекомендует использовать WSGI, чтобы веб-сервер (Apache, NginX и т. Д.) Загружал и выгружал Django по мере необходимости автоматически. Here's how to do that. Кроме того, встроенный веб-сервер Django не считается secure or scalable. В общем, не делай этого!

Если вы прочь использовать WSGI, вы также можете сделать proxypass with Apache, NginX и т.д. Сервер Джанго сам может управлять любым количеством инструментов системы обслуживания, как init.d или supervisord.

Чтобы ответить на ваш вопрос, вы можете использовать process.terminate(), чтобы убить активный процесс, запущенный с subprocess, но это ужасная идея запустить ваш сервер с помощью скрипта python, когда существует много других замечательных инструментов.

+0

Дело в том, что для разработки я хочу, чтобы одна команда запускала локальный веб-сервер, кофе и меньше компиляторов. И одна команда, чтобы убить их всех одновременно – imkost

+0

'terminate' command не работает, обновил мой вопрос, чтобы показать, что я делаю с завершением – imkost