将web.py作为守护进程运行

5 投票
4 回答
6255 浏览
提问于 2025-04-15 12:44

我有一个简单的 web.py 程序用来加载数据。在服务器上,我不想安装 apache 或其他任何网络服务器。

我尝试把它作为一个后台服务运行,参考了这个链接:http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

并且进行了子类化处理:
(来自 http://www.jejik.com/files/examples/daemon.py)

class Daemon:
    def start(self):
        """
        Start the daemon
        """
        ... PID CHECKS....

        # Start the daemon
        self.daemonize()
        self.run()
#My code
class WebService(Daemon):
        def run(self):
            app.run()

if __name__ == "__main__":
    if DEBUG:
        app.run()
    else:
        service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid'))
        if len(sys.argv) == 2:
            if 'start' == sys.argv[1]:
                service.start()
            elif 'stop' == sys.argv[1]:
                service.stop()
            elif 'restart' == sys.argv[1]:
                service.restart()
            else:
                print "Unknown command"
                sys.exit(2)
            sys.exit(0)
        else:
            print "usage: %s start|stop|restart" % sys.argv[0]
            sys.exit(2)

但是,web.py 软件没有加载(也就是说:这个服务没有在监听)。

如果我直接调用它(也就是不使用守护进程代码),它就能正常工作。

4 个回答

0

我觉得你没有让后台程序运行。你需要先创建一个 MyDaemon 对象,然后调用 o.run()。看起来 WebService 只是启动和停止你网页应用的服务接口,并不是直接启动网页应用本身。

5

你可以通过这个命令来启动 web.py

/usr/bin/python index.py > log.txt 2>&1 & 
5

我终于找到了问题所在。

Web.py 允许从命令行输入一个可选的端口号:

python code.py 80

这个脚本也可以从命令行接收输入:

python WebServer start

然后 web.py 尝试把 "start" 当作端口号来用,但失败了。我没有看到错误,因为它是在后台运行的。

我用一个小技巧解决了这个问题:

if __name__ == "__main__":
    if DEBUG:
        app.run()
    else:
        service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid'))
        if len(sys.argv) == 2:
            if 'start' == sys.argv[1]:
                sys.argv[1] = '8080'
                service.start()

撰写回答