2014-09-09 1 views
1

Я видел немало людей, борющихся с ним - у меня тоже проблемы. Было бы очень полезно, если бы кто-то помог сделать пример CherryPy Service. Было бы весьма полезно ознакомиться с этими вопросами.CherryPy как служба Windows - пример

Существует CherryPy в качестве службы Windows пример доступен по адресу: CherryPy Wiki. Я пытаюсь заставить его работать. Вот мой код:

""" 
The most basic (working) CherryPy 3.0 Windows service possible. 
Requires Mark Hammond's pywin32 package. 
""" 

import cherrypy 
import win32serviceutil 
import win32service 
import win32event 
import servicemanager 

class HelloWorld: 
    """ Sample request handler class. """ 

    def index(self): 
     return "Hello world!" 
    index.exposed = True 


class MyService(win32serviceutil.ServiceFramework): 
    """NT Service.""" 

    _svc_name_ = "CherryPyService" 
    _svc_display_name_ = "CherryPy Service" 

    def __init__(self, args): 
     win32serviceutil.ServiceFramework.__init__(self, args) 
     # create an event that SvcDoRun can wait on and SvcStop 
     # can set. 
     self.stop_event = win32event.CreateEvent(None, 0, 0, None) 

    def SvcDoRun(self): 
     self.ReportServiceStatus(win32service.SERVICE_START_PENDING) 
     servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, 
           servicemanager.PYS_SERVICE_STARTED, 
           (self._svc_name_,'')) 

     cherrypy.tree.mount(HelloWorld(), '/') 

     # in practice, you will want to specify a value for 
     # log.error_file below or in your config file. If you 
     # use a config file, be sure to use an absolute path to 
     # it, as you can't be assured what path your service 
     # will run in. 
     cherrypy.config.update({ 
      'global':{ 
       'engine.autoreload.on': False, 
       'log.screen': False, 
       'log.error_file': 'c:\\MG\\temp\\CherryPy_Sample_Service.log', 
       'engine.SIGHUP': None, 
       'engine.SIGTERM': None 
       } 
      }) 
     # set blocking=False so that start() does not block 
     cherrypy.server.quickstart() 
     cherrypy.engine.start(blocking=False) 
     # now, block until our event is set... 
     win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE) 
     self.ReportServiceStatus(win32service.SERVICE_RUNNING) 

    def SvcStop(self): 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     cherrypy.server.stop() 
     win32event.SetEvent(self.stop_event) 

if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(MyService) 

Вышеупомянутый отличается от приведенного примера. Я добавил

  • self.ReportServiceStatus(win32service.SERVICE_START_PENDING) и
  • self.ReportServiceStatus(win32service.SERVICE_RUNNING) как первый и последний отчет о SvcDoRun
  • 'log.error_file': 'c:\\MG\\temp\\CherryPy_Sample_Service.log', как вики инструктирует

Важное замечание: в то время как можно использовать консоль python cherrypy_sample_service.py install, чтобы установить услугу, это невозможно, чтобы начать с использования python cherrypy_sample_service.py start. Причиной этого является то, что созданная таким образом служба будет ссылаться на исполняемый файл python, который не предназначен как служба.

Поэтому для моего дальнейшего тестирования я составил код, используя следующие:

from cx_Freeze import setup, Executable 

exe = Executable(
    script='cherrypy_sample_service.py' 
) 


build_options = {'includes': ['cherrypy', 'win32serviceutil', 'win32service', 'win32event', 'servicemanager']} 

setup(
     name = "CherryPy Sample Service", 
     version = "0.1", 
     service = ["cherrypy_sample_service.py"], 
     options = {"build_exe" : build_options}, 
     executables = [exe]) 

Во время сборки я получаю следующее предупреждение:

Python27\App\lib\distutils\dist.py:267: UserWarning: Unknown distribution option: 'service' 
warnings.warn(msg) 

Я добавил этот параметр в соответствии с следующие stack problem answer.

Теперь я могу позвонить cherrypy_sample_service install, cherrypy_sample_service remove и cherrypy_sample_service update. Тем не менее, пытаясь запустить службу (либо из услуг или через cherrypy_sample_service start) приводит к следующей ошибке:

Error starting service: The service did not respond to the start or control request in a timely fashion. 

И я застрял. Файл журнала даже не создается. Не могли бы вы помочь мне запустить этот пример? Думаю, это было бы полезно и для других людей, борющихся со связанными с ними проблемами, если бы мы могли объяснить пример и запустить его. Благодаря!

ответ

1

Наконец-то я нашел решение - Я скачал и переустановил pywin32 ... Все работает отлично! :)

Некоторые заключительные замечания:

  • Сервис начинает отлично от редактора - компиляция не требуется.
  • Добавление 'log.error_file': 'c:\\somedir\cherypy_sample_service.log', чтобы cherrypy.config.update помогает проверить, что услуга до & работает

При попытке отладить эту проблему, я обнаружил, что когда-то win32serviceutil.HandleCommandLine называет StartService и попадает в эту часть кода:

try: 
     win32service.StartService(hs, args) 
    finally: 
     win32service.CloseServiceHandle(hs) 

Я не смог войти в win32service.StartService. Мне не удалось найти файл, и именно поэтому я переустановил pywin32.

Я мог только видеть сообщение об ошибке - надеюсь, что это будет полезно для других.

1

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

""" 
The most basic (working) CherryPy 3.1 Windows service possible. 
Requires Mark Hammond's pywin32 package. 
""" 

import cherrypy 
import win32serviceutil 
import win32service 

class HelloWorld: 
    """ Sample request handler class. """ 

    @cherrypy.expose 
    def index(self): 
     return "Hello world!" 


class MyService(win32serviceutil.ServiceFramework): 
    """NT Service.""" 

    _svc_name_ = "CherryPyService" 
    _svc_display_name_ = "CherryPy Service" 

    def SvcDoRun(self): 
     cherrypy.tree.mount(HelloWorld(), '/') 

     # in practice, you will want to specify a value for 
     # log.error_file below or in your config file. If you 
     # use a config file, be sure to use an absolute path to 
     # it, as you can't be assured what path your service 
     # will run in. 
     cherrypy.config.update({ 
      'global':{ 
       'log.screen': False, 
       'engine.autoreload.on': False, 
       'engine.SIGHUP': None, 
       'engine.SIGTERM': None 
       } 
      }) 

     cherrypy.engine.start() 
     cherrypy.engine.block() 

    def SvcStop(self): 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     cherrypy.engine.exit() 

     self.ReportServiceStatus(win32service.SERVICE_STOPPED) 
     # very important for use with py2exe 
     # otherwise the Service Controller never knows that it is stopped ! 

if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(MyService) 

Тестовая среда была: XP SP3, Python 2.7.5, CherryPy 3.3,0, pywin32 218,4.

Отладочных советы

Там нет требования, чтобы построить двоичный файл для запуска службы. Когда вы устанавливаете службы pywin32 из источника, в качестве прокси-сервера используется %PYDIR%\Lib\site-packages\win32\pythonservice.exe. То есть все службы имеют его как run command line, имея REG:\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CherryPyService\PythonClass, определяющий действительный класс Python для этой службы.

Запустите pythonservice.exe из командной строки и убедитесь, что он работает без ошибок (1). Вы также можете заметить, что есть опция отладки, которая позволяет присоединить stdout и stderr к терминалу (2).

Убедитесь, что нет брандмауэра, который предотвращает pythonservice.exe от сетевой активности.

+0

Я по-прежнему беззаботно болтаю с этим. Я попробовал это (просто простой сервис без вишни): http://stackoverflow.com/questions/32404/is-it-possible-to-run-a-python-script-as-a-service-in- windows-if-possible-how и не работает. Я использую Win7 (на разных машинах). Я предполагаю, что это связано с некоторыми привилегиями. – Maciejg