Как можно вечно запускать серверный скрипт? - PullRequest
1 голос
/ 15 сентября 2009

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

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

Ответы [ 5 ]

3 голосов
/ 16 сентября 2009

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

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

Как бы я справился с чем-то подобным?

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

Я в замешательстве? или есть более эффективные способы реализации асинхронного сокетного взаимодействия?

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

Как запустить скрипт один раз через сервер Apache, как мне остановить его выполнение?

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

1 голос
/ 15 сентября 2009

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

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

Как запустить скрипт один раз через сервер Apache, как мне остановить его выполнение?

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

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

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

1 голос
/ 15 сентября 2009

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

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

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

0 голосов
/ 16 сентября 2009

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

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

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

0 голосов
/ 15 сентября 2009

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

...