如何让服务器端脚本永久运行?

1 投票
5 回答
1810 浏览
提问于 2025-04-15 14:20

我需要让一个服务器端的脚本,比如用Python写的,能够“永远”运行(或者尽可能长时间地保持状态),这样它就可以保持socket连接,并且能够异步地对像数据接收这样的事件做出反应。例如,如果我使用Twisted来进行socket通信。

  • 我该如何管理这样的事情呢?
  • 我是不是搞错了?或者有没有更好的方法来实现异步的socket通信?
  • 通过Apache服务器启动脚本后,我该如何停止它的运行?

5 个回答

1

你可以写一个脚本,让它一直在一个循环里等着连接的发生,同时也等着一个信号来关闭这个连接。

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

然后要停止它,你只需要运行另一个脚本,给它发送那个信号就可以了。

1

你可以使用“双重分叉”来在一个新的后台进程中运行你的代码,这个新进程和旧的进程没有关系。比如可以参考这个链接,里面有很多解释性的评论,能帮助你理解。

不过,我不建议把这个作为网站后台任务的主要方法。比如,如果你的Python代码是在Apache进程中运行的,那你可能会分叉出比你想要的更多的进程。更好的做法是单独启动一个守护进程(daemon),并且用一个类似的低权限用户来运行。

在通过Apache服务器启动脚本后,我该如何停止它的运行?

你可以让第二个分叉把守护进程的进程号(pid)写入一个文件,然后从这个文件中读取pid,并发送一个终止信号给它(os.kill(pid, signal.SIG_TERM))。

我是不是搞混了?

这就是问题所在!我猜测你是想要一个后台进程,它能在不同的端口上响应网络界面,提供某种特殊的网络服务。如果你只是想处理普通的网页请求,那就不应该这样做,应该依靠Apache来处理你的连接,并且一次只服务一个请求。

3

如果你在使用Twisted框架,它有一整套系统来启动和停止后台进程。

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

我该怎么管理这样的事情呢?

Twisted在这方面表现得很好,看看上面的链接吧。

我是不是搞错了?还是有更好的方法来实现异步的socket通信?

Twisted在异步socket通信方面非常出色。不过,刚开始用的时候可能会让人觉得有点难懂,等你熟悉了就好了!

通过Apache服务器启动脚本一次后,我该怎么停止它的运行呢?

Twisted的工具假设你可以使用命令行,所以如果我理解正确的话,你需要写一个cgi包装器来启动和停止它们。

撰写回答