Каковы способы вечно запускать серверный скрипт?
Вопрос
Мне нужно запустить серверный скрипт типа Python "навсегда" (или как можно дольше без потери состояния), чтобы они могли сохранять розетки открыты и асинхронно реагировать на события, подобные полученным данным.Например, если я использую Скрученный для связи с сокетом.
- Как бы я справился с чем-то подобным?
- Я в замешательстве?или есть лучшие способы реализовать асинхронную связь с сокетами?
- После запуска скрипта один раз через сервер Apache, как мне остановить его запуск?
Решение
Если вы используете twisted, то у него есть целая инфраструктура для запуска и остановки демонов.
http://twistedmatrix.com/projects/core/documentation/howto/application.html
Как бы я справился с чем-то подобным?
Twisted хорошо подходит для этого, прочитайте ссылку выше
Я в замешательстве?или есть лучшие способы реализовать асинхронную связь с сокетами?
Twisted очень хорош в асинхронной связи с сокетами.Однако это тяжело воздействует на мозг, пока вы не освоитесь с этим!
После запуска скрипта один раз через сервер Apache, как мне остановить его запуск?
Инструменты twisted предполагают доступ к командной строке, поэтому вам придется написать cgi-оболочку для их запуска / остановки, если я понимаю, что вы хотите сделать.
Другие советы
Вы можете просто написать скрипт, который постоянно находится в блоке while, ожидая установления соединения, и ожидает сигнала для его закрытия.
http://docs.python.org/library/signal.html
Затем, чтобы остановить это, вам просто нужно запустить другой скрипт, который посылает ему этот сигнал.
Вы можете использовать ‘двойную развилку’ для запуска вашего кода в новом фоновом процессе, не привязанном к старому.Смотрите , например это рецепт с большим количеством поясняющих комментариев, чем вы могли бы пожелать.
Я бы не рекомендовал это в качестве основного способа запуска фоновых задач для веб-сайта.Например, если ваш Python встроен в процесс Apache, вы будете разветвлять больше, чем хотите.Лучше вызвать демона отдельно (только от имени аналогичного пользователя с низкими привилегиями).
После запуска скрипта один раз через сервер Apache, как мне остановить его запуск?
Ваш второй форк записывает номер процесса (pid) процесса-демона в файл, а затем считывает pid из этого файла и отправляет ему сигнал завершения (os.kill(pid, signal.SIG_TERM)
).
Я в замешательстве?
Вот в чем вопрос!Я предполагаю, что вы пытаетесь запустить фоновый процесс, который реагирует на другой порт веб-интерфейса для какой-то необычной сетевой службы.Если вы просто говорите об ответе на обычные веб-запросы, вы не должны этого делать, вы должны полагаться на Apache для обработки ваших сокетов и обслуживания одного запроса за раз.
Я думаю, что Комета это то, что вы ищете.Обязательно взгляните и на Торнадо.
Возможно, вы захотите взглянуть на FastCGI, это звучит в точности так, как вы ищете, но я не уверен, находится ли это в стадии текущей разработки.Он использует демон CGI и специальный модуль apache для связи с ним.Поскольку демон работает долго, у вас нет затрат на форк / exec.Но как стоимость управления вашими собственными ресурсами (без автоматической очистки по каждому запросу)
Одна из причин, по которой этот стиль FastCGI больше не используется, заключается в том, что существуют способы встраивать интерпретаторы в двоичный файл Apache и запускать их на сервере.Я не знаком с mod_python, но я знаю, что mod_perl имеет конфигурацию, позволяющую запускать длительные процессы.Будьте осторожны здесь, так как длительный процесс на сервере может привести к утечке ресурсов.
Общий вопрос заключается в следующем:что ты хочешь сделать?Зачем вам нужен этот второй процесс, но все же каким-то образом управляемый apache?Почему вы не можете просто создать демон, который взаимодействует с apache, почему он должен управляться apache?