【问题标题】:What are the ways to run a server side script forever?永久运行服务器端脚本的方法是什么?
【发布时间】:2009-09-16 15:36:21
【问题描述】:
我需要“永远”运行像 Python 这样的服务器端脚本(或者尽可能长时间地运行而不丢失状态),这样他们就可以保持sockets open 并对接收到的数据等事件做出异步反应。例如,如果我使用Twisted 进行套接字通信。
- 我将如何管理这样的事情?
- 我感到困惑吗?还是有更好的方法来实现异步套接字通信?
- 通过 Apache 服务器启动脚本一次后,如何停止运行?
【问题讨论】:
标签:
python
apache
sockets
webserver
twisted
【解决方案3】:
您可以使用“双叉”在未绑定到旧后台进程的新后台进程中运行您的代码。请参阅例如 this recipe,其中包含比您可能想要的更多解释性 cmets。
我不建议将此作为为网站运行后台任务的主要方式。例如,如果您的 Python 嵌入在 Apache 进程中,那么您的分叉将超出您的预期。最好单独调用守护进程(就在类似的低权限用户下)。
通过 Apache 服务器启动脚本一次后,如何停止运行?
您让您的第二个 fork 将守护进程的进程号 (pid) 写入文件,然后从该文件中读取 pid 并向其发送终止信号 (os.kill(pid, signal.SIG_TERM))。
我很困惑吗?
这就是问题!我假设您正在尝试拥有一个后台进程,该进程在不同的端口上响应 Web 界面以获取某种不寻常的网络服务。如果您只是谈论响应正常的 Web 请求,您不应该这样做,您应该依靠 Apache 来处理您的套接字并一次处理一个请求。
【解决方案4】:
我认为Comet 是您正在寻找的。一定要看看 Tornado。
【解决方案5】:
您可能想查看 FastCGI,它听起来与您正在寻找的完全一样,但我不确定它是否正在开发中。它使用一个 CGI 守护进程和一个特殊的 apache 模块与之通信。由于守护程序长时间运行,因此您没有 fork/exec 成本。但作为管理您自己资源的成本(不会对每个请求进行自动清理)
这种风格的 FastCGI 不再被使用的一个原因是有一些方法可以将解释器嵌入到 Apache 二进制文件中并让它们在服务器中运行。我不熟悉 mod_python,但我知道 mod_perl 具有允许长时间运行的进程的配置。这里要小心,因为服务器中长时间运行的进程会导致资源泄漏。
一个普遍的问题是:你想做什么?为什么你需要第二个进程,却又以某种方式被 apache 控制?为什么你不能只建立一个与apache对话的守护进程,为什么它必须由apache控制?