2013-06-10 2 views
1

У меня есть рабочий сервер с помощью Tornado теперь, согласно ответу здесь: Python BaseHTTPServer and TornadoКак обернуть питон демон вокруг моего кода

Я хотел бы демон его. Я читал этот класс класса daemon here, но я не могу понять, как он обертывается вокруг моего кода сервера. Я просто поместил весь код из __main__ в run(), который я переопределяю?

Как мне подклассифицировать его, если он находится в другом файле? Убедитесь, что он находится в одном каталоге и использует его имя файла без расширения .py для импорта?

Я просто ищу самый простой способ запустить мой скрипт веб-сервера python с помощью простого вызова, такого как ./startserver.sh (например, если бы я использовал сценарий bash) и запустить его в фоновом режиме без файла nohup.out и всех stdout и stderr, перенаправленных в файлы журнала.

ответ

0

Давайте будем простыми. Дерево проекта:

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

daemon.py является Daemon классом от http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/, server.py резьбы версии кода из Python BaseHTTPServer and Tornado, __init__.py пустого файл, который позволяет импортировать код из других файлов в каталоге.main.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 and Tornado изменений if __name__ == '__main__': в def myfun(): и вызывать его из run() метода Daemon подкласса.

+0

Блестяще тщательный, но описательный, спасибо! – Hamid

4

Попробуйте использовать пакет daemon 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


stdout и stderr записываются в /var/log/supervisor/.

+0

Должен ли мой код python содержать любой код forking и т. Д., Чтобы это работало или это был простой скрипт python? – Hamid

+0

Кроме того, я бы предпочел что-то портативное, поэтому я могу взять скрипт и запустить его в любом месте без основной зависимости вроде этого. – Hamid

+1

Я должен проголосовать за этот вариант. Supervisor также добавляет CTL и веб-интерфейс, с помощью которых вы можете запускать/останавливать службы, просматривать файлы журналов и т. Д. – Tomas

Смежные вопросы