Python服务 - Wix MSI安装程序 - 启动时自动启动无法正常工作

时间:2015-11-04 18:15:45

标签: python wcf service wix windows-installer

我有一个有效的python win32服务,尝试通过使用WiX Toolset构建的msi进行分发。

但是,该服务安装为“Startup Type Automatic”,安装时启动,以sc命令启动,并且功能正常。

但重新启动计算机时,它不会自动启动。它试图启动,但我在事件查看器中得到2个错误 - > Windows日志 - >系统

A timeout was reached (30000 milliseconds) while waiting for the Edit Service service to connect.

The Edit Service service failed to start due to the following error: The service did not respond to the start or control request in a timely fashion.

以下是引用serviceinstall的WiX部分。

                        

             <File Id="MainEXE" Source="editservice.exe" KeyPath="yes"/>
                    <ServiceControl Id="Edit" Name=Edit Service" Start="install" Stop="both" Remove="uninstall" Wait="yes" />


                    <ServiceInstall 
                        Id="service" 
                        Account="\Ps" 
                        Password="scrubed$" 
                    Start="auto" 
                    ErrorControl="normal" 
                    Name="Edit Service" 
                    Type="ownProcess" 
                    Vital="yes"      />

                    <RemoveFolder Id="Purge"  On="uninstall" />

为什么只有在系统启动时才能启动它的任何想法?如果需要,我可以提供更多的WiX或python服务实现

2 个答案:

答案 0 :(得分:0)

所以我想我已经弄清楚.. 服务启动功能中的每一行都会被执行。

然而 - 最后一行代码是对time.sleep(10)的调用。似乎这行代码没有完成运行,导致启动失败即使服务正在运行

在生产中,睡眠时间将增加到一小时。因此我认为延迟开始是首选方法。

要在WiX中执行此操作,请按照以下代码模板进行操作。

                 <ServiceControl Id="Edit" Name="NBC Edit Service" Start="install" Stop="both" Remove="uninstall" Wait="yes" />


                    <ServiceInstall 
                        Id="service" 
                        Account="NYDPS\Portus" 
                        Password="getyourownpassword" 
                        Start="auto"
                        ErrorControl="normal"
                        Name="NBC Edit Service"
                        Type="ownProcess"
                        Vital="yes" >

                        <ServiceConfig DelayedAutoStart="yes" OnInstall="yes" OnReinstall ="yes" />
                    </ServiceInstall>

                    <RemoveFolder Id="Purge"  On="uninstall" />

答案 1 :(得分:0)

@tdelaney @PhilDW真实的答案..

FWIW - 在python服务中使用time.sleep(),是进入一个占用处理器时间的无限循环。在无限循环中接收单曲是不可能的。有一种 Windows服务实现方式来完成睡眠

而不是

sleep.time(10)

使用

#where timeout = sleep time

if win32event.WaitForSingleObject(self.hWaitStop, timeout) == win32event.WAIT_OBJECT_0: break

注意 - sleep.time输入以秒为单位,win32event.WaitForSingleObject以毫秒为单位