2009-09-15 2 views
1

Мне нужно запустить скрипт на стороне сервера, такой как Python «навсегда» (или как можно дольше, без потери состояния), чтобы они могли поддерживать sockets open и асинхронно реагировать на такие события, как полученные данные. Например, если я использую Twisted для связи сокетов.Каковы способы запуска скрипта на стороне сервера навсегда?

  • Как мне с этим справиться?
  • Я в замешательстве? или существуют ли лучшие способы реализации асинхронной связи сокетов?
  • После запуска сценария через сервер Apache, как его остановить?

ответ

3

Если вы используете витую, то у него есть целая инфраструктура для запуска и остановки демонов.

http://twistedmatrix.com/projects/core/documentation/howto/application.html

Как бы мне удалось что-то вроде этого?

Twisted работает хорошо для этого, читайте по ссылке выше

ли я спутать? или существуют ли лучшие способы реализации асинхронной связи сокетов?

Скрученный очень хорош при асинхронной связи сокетов. Это тяжело для мозга, пока вы не получите его!

После запуска сценария через сервер Apache, как его остановить?

Скрученные инструменты предполагают доступ к командной строке, поэтому вам нужно написать cgi-оболочку для запуска/остановки, если я пойму, что вы хотите сделать.

1

Вы можете просто написать сценарий, который находится в непрерывном режиме, ожидая, когда произойдет соединение, и ждет сигнала, чтобы закрыть его.

http://docs.python.org/library/signal.html

Тогда, чтобы остановить его нужно просто запустить другой скрипт, который посылает этот сигнал к нему.

0

Я думаю, что Comet - это то, что вы ищете. Не забудьте взглянуть и на Торнадо.

1

Вы можете использовать «двойную вилку» для запуска вашего кода в новом фоновом процессе, который несвязан со старым. См., Например, this рецепт с более пояснительными комментариями, чем вы, возможно, захотите.

Я бы не рекомендовал это в качестве основного способа запуска фоновых задач для веб-сайта. Например, если ваш Python встроен в процесс Apache, вы будете разворачивать больше, чем хотите. Лучше всего вызывать демона отдельно (только под аналогичным пользователем с низким уровнем привилегий).

После запуска сценария через сервер Apache, как его остановить?

У вас есть ваша вторая вилка записать номер процесса (PID) процесса демона в файл, а затем прочитать PID из этого файла и отправить его сигнал (os.kill(pid, signal.SIG_TERM)) прекратить.

Я в замешательстве?

В этом вопрос! Я предполагаю, что вы пытаетесь создать фоновый процесс, который реагирует на другой порт на веб-интерфейс для какого-то необычного сетевого сервиса. Если вы просто говорите об ответе на обычные веб-запросы, вы не будете этого делать, вам следует полагаться на Apache для обработки ваших сокетов и обслуживания одного запроса за раз.

0

Возможно, вы захотите посмотреть FastCGI, это похоже на то, что вы ищете, но я не уверен, что он находится в текущей разработке. Он использует демон CGI и специальный модуль apache для связи с ним. Поскольку демон длительный, у вас нет стоимости fork/exec. Но как стоимость управления вашими собственными ресурсами (без автоматической очистки по каждому запросу)

Одна из причин, почему этот стиль FastCGI больше не используется, есть способы встраивания интерпретаторов в двоичный файл Apache и их запуск в сервер. Я не знаком с mod_python, но я знаю, что mod_perl имеет конфигурацию, чтобы разрешить длительные процессы. Будьте осторожны, поскольку длительный процесс на сервере может вызвать утечку ресурсов.

Общий вопрос: что вы хотите сделать? Зачем вам этот второй процесс, но каким-то образом контролируется апачем? Почему can'ty просто построить демона, который говорит с apache, почему он должен контролироваться apache?