1

ここでの回答によると、Tornado を使用するサーバーが動作しています: Python BaseHTTPServer and Tornado

私はそれをデーモン化したいと思います。このデーモン クラスの例を何度も読んでいます、サーバー コードをどのようにラップするかわかりません。オーバーライド__main__するからすべてのコードを入れるだけですか?run()

別のファイルにある場合もサブクラス化するにはどうすればよいですか? 同じディレクトリにあり、.py 拡張子のないファイル名を使用してインポートすることを確認しますか?

./startserver.sh(たとえば、bash スクリプトを使用する場合)などの単純な呼び出しだけで Python Web サーバー スクリプトを実行し、nohup.out なしでバックグラウンドで実行する最も簡単な方法を探しています。ファイル、およびすべての stdout と stderr がログ ファイルにリダイレクトされます。

4

2 に答える 2

4

supervisorLinux でデーモン パッケージを使用してみてください。物事を簡単にデーモン化できます。

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


stdoutディレクトリにstderr記録されます/var/log/supervisor/

于 2013-06-10T19:49:51.507 に答える
0

Let's keep it simple. Project tree:

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

daemon.py is a Daemon class from http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/, server.py is threaded version of code from Python BaseHTTPServer and Tornado, __init__.py is an empty file which allows us to import code from other files in directory. main.py is:

#!/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)

Run it with:

$ python main.py start

For first version from Python BaseHTTPServer and Tornado change if __name__ == '__main__': to def myfun(): and call it from run() method of Daemon subclass.

于 2013-06-10T21:53:35.533 に答える