鄭昀@玩聚SR 20090515
1、現象:
用Python的win32serviceutil控制Windows Service啟動、停止、重啟時,如下代碼一般是沒問題的。
import win32serviceutil
def service_manager(action, machine, service):
if action == 'stop':
win32serviceutil.StopService(service, machine)
elif action == 'start':
win32serviceutil.StartService(service, machine)
elif action == 'restart':
win32serviceutil.RestartService(service, machine)
elif action == 'status':
if win32serviceutil.QueryServiceStatus(service, machine)[1] == 4:
print "%s is happy" % service
else:
print "%s is being a PITA" % service
但控制Apache Service時,會出現一個很怪的現象。
譬如運行這麼簡單的語句:
import win32serviceutil
win32serviceutil.StartService("Apache2.2","localhost")
順利執行後,停止的Apache服務並沒有被啟動。
此時,Windows事件記錄就會報告這種錯誤:
事件類型: 錯誤
事件來源: Apache Service
事件種類: 無
事件 ID: 3299
The Apache service named reported the following error:
>>> Usage: C:""Apache2.2""bin""httpd.exe [-D name] [-d directory] [-f file]
同樣,win32serviceutil.RestartService 函數雖然可以先正常地停止掉Apache服務,但試圖啟動時仍遇到同樣的錯誤。
在多台伺服器(Windows2003+SP2)和我本機(WindowsXP+SP2)都可以重現。
2、解決:
把machine參數去掉不傳即可,或傳Null 字元串。
即:
win32serviceutil.StartService("Apache2.2")
或
win32serviceutil.StartService("Apache2.2","")
可以正常啟動原生Apache,這樣無法遙控域內其他伺服器了。
3、更多:
1:win32serviceutil.StartService(service, '-w -n "Apache2.2" -k start')
這樣不傳machine參數,只設定服務啟動的傳入參數也不行。
2:對於 win32serviceutil.StopService 函數,停止Apache等Windows服務時,不存在此問題。