2009-07-07 4 views
5

У меня есть простая программа для загрузки данных. На сервере я не хочу устанавливать apache или любой веб-сервер. неЗапустить web.py как daemon

я пытаюсь поставить его в качестве справочного сервиса с 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 не загружается (то есть: Служба не слушать)

Если я вызываю это напрямую (то есть: Нет, используя код демона), работайте нормально.

ответ

5

Я, наконец, нашел проблему.

web.py принимают из командной строки дополнительный номер порта:

python code.py 80 

и сценарий также принимать входные данные из командной строки:

python WebServer start 

затем web.py попробовать использовать «начать» как номер порта и выйти из строя. Я не вижу ошибку, потому что был в bacground.

исправить это с помощью мини-хак:

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() 
0

Я не думаю, что вы говорите демону, чтобы он бежал. Вам нужно создать экземпляр объекта MyDaemon и вызвать o.run(). Похоже, что WebService запускает и останавливает сервисный интерфейс для вашего веб-приложения, а не самого веб-приложения.

+0

Я обновляю вопрос, чтобы показать, что когда вызов «старт» называется методом «запуска». – mamcx

+0

Я до сих пор не могу сказать, как служба (из WebService) подключается к MyDaemon, если она не скрыта. – mcandre

+0

О, моя ошибка :(Я забыл поставить правильное имя класса (плохая копия/вставка!) – mamcx

4

вы можете начать web.py с помощью этой команды

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

Вместо перезаписи второй аргумент, как вы написали здесь:

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() 

Вы можете просто удалить второй аргумент в «start | restart», например:

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]: 
       delete del sys.argv[1:2] 
       service.start() 

Таким образом, веб-страница получит все аргументы, переданные из командной строки, кроме контроллера демона. Тогда вы можете просто запустить:

python WebServer start 8080 
Смежные вопросы