1

我现在有一个使用 Tornado 的工作服务器,根据这里的答案:Python BaseHTTPServer and Tornado

我想守护它。我一直在阅读这个守护进程类示例here,但我不知道它是如何包装我的服务器代码的。我是否只是将所有代码放在我覆盖的代码__main__run()

如果它在另一个文件中,我如何对其进行子类化?确保它在同一个目录中并使用它的文件名没有 .py 扩展名来导入?

我只是在寻找最简单的方法来运行我的 python Web 服务器脚本,只需要一个简单的调用,例如./startserver.sh(例如,如果我要使用 bash 脚本)并让它在没有 nohup.out 的情况下在后台运行文件和所有标准输出和标准错误重定向到日志文件。

4

2 回答 2

4

尝试supervisor在 Linux 上使用守护程序包。它使您可以轻松地守护事物。

对于 Ubuntu:sudo apt-get install supervisor

创建一个conf.d文件:

cd /etc/supervisor/conf.d/ vim pyhttpd.conf

在你的内部pyhttpd.conf

[program:pyhttpd]
directory=/path/to/project
environment=ENV_VAR=ENV_VAL,ENV_VAR2=ETC
command=startserver.sh
autostart=true
autorestart=true

最后,supervisor使用新配置进行更新:

supervisorctl update

它应该为您启动,并且现在将在您启动时运行。


这些命令也可用:

supervisorctl stop pyhttpd

supervisorctl start pyhttpd

supervisorctl restart pyhttpd


stdoutstderr记录到/var/log/supervisor/目录中。

于 2013-06-10T19:49:51.507 回答
0

让我们保持简单。项目树:

$ tree
.
├── daemon.py
├── main.py
├── server.py
└──  __init__.py

daemon.py是来自http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/的守护程序类,是来自Python BaseHTTPServer 和 Tornadoserver.py的代码的线程版本,是一个空文件,它允许我们从目录中的其他文件导入代码. 是:__init__.pymain.py

#!/usr/bin/env python

import sys, time, threading
from daemon import Daemon
from server import run_tornado, run_base_http_server

class ServerDaemon(Daemon):
    def run(self):
        threads = [
            threading.Thread(target=run_tornado),
            threading.Thread(target=run_base_http_server)
        ]

        for thread in threads:
            thread.start()
        for thread in threads:
            thread.join()

if __name__ == "__main__":
    daemon = ServerDaemon('/tmp/server-daemon.pid')

    if len(sys.argv) == 2:
        if 'start' == sys.argv[1]:
            daemon.start()          
        elif 'stop' == sys.argv[1]:
            daemon.stop()
        elif 'restart' == sys.argv[1]:
            daemon.restart()
        else:
            print "Unknown command"
            sys.exit(2)
        sys.exit(0)
    else:
        print "usage: %s start|stop|restart" % sys.argv[0]
        sys.exit(2)

运行它:

$ python main.py start

对于Python BaseHTTPServer 和 Tornado的第一个版本,从子类的方法更改 if __name__ == '__main__':def myfun():调用它。run()Daemon

于 2013-06-10T21:53:35.533 回答