用python写一个windows服务,以实现持续检测a.exe程序有没有启动
时间: 2023-08-31 22:28:59 浏览: 184
### 回答1:
可以使用 Python 模块 `win32service` 和 `win32serviceutil` 来写一个 Windows 服务,实现持续检测 `a.exe` 程序是否启动。
下面是一个简单的示例代码:
```
import win32service
import win32serviceutil
import win32event
import win32process
import time
class MyService(win32serviceutil.ServiceFramework):
_svc_name_ = "MyService"
_svc_display_name_ = "My Service"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
while True:
# 检测 a.exe 程序是否启动
try:
pid = win32process.FindProcessesByName("a.exe")[0]
print("a.exe 已启动")
except:
print("a.exe 没有启动")
# 每隔 5 秒检测一次
time.sleep(5)
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(MyService)
```
使用 `python your_script.py install` 安装服务,使用 `python your_script.py start` 启动服务,使用 `python your_script.py stop` 停止服务。
该示例代码会每隔 5 秒检测一次 `a.exe` 程序是否启动,如果启动了,会打印 "a.exe 已启动",如果没有启动,会打印 "a.exe 没有启动"。
### 回答2:
要使用Python写一个Windows服务来实现持续检测a.exe程序有没有启动,我们可以使用`pywin32`库来操作Windows API。下面是一个简单示例:
```python
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import os
# 服务名称
service_name = 'AService'
class AService(win32serviceutil.ServiceFramework):
_svc_name_ = service_name
_svc_display_name_ = service_name
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.is_running = False
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
self.is_running = False
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ''))
self.is_running = True
while self.is_running:
# 检测a.exe是否正在运行
if not self.is_a_running():
# 当a.exe没有运行时,在这里执行相应的操作,比如重启a.exe
self.start_a()
# 检测间隔为5秒
win32event.WaitForSingleObject(self.hWaitStop, 5000)
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STOPPED,
(self._svc_name_, ''))
def is_a_running(self):
# 获取当前系统中运行的进程列表
pids = os.popen('tasklist /FI "IMAGENAME eq a.exe" /NH').read()
return "a.exe" in pids
def start_a(self):
# 启动a.exe
os.startfile('a.exe')
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AService)
```
上述代码创建了一个名为`AService`的Windows服务类,实现持续检测`a.exe`程序有没有启动的功能。在`SvcDoRun`方法中,使用`is_a_running`方法检测`a.exe`进程是否正在运行,如果不在运行则启动`a.exe`。这里以重启`a.exe`为例,你可以根据实际需求,在相应处执行适当的操作。
你可以使用`pyinstaller`将上述代码打包成可执行的`.exe`文件,并使用`sc create`命令将其安装为Windows服务,然后使用`net start`命令启动该服务。
### 回答3:
要使用Python编写一个Windows服务来实现持续检测a.exe程序是否启动,可以使用win32service和win32serviceutil模块来实现。
首先,需要安装pywin32库,可以使用以下命令来安装:
```
pip install pypiwin32
```
然后,创建一个名为"service.py"的Python脚本,代码如下:
```python
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import subprocess
class MyService(win32serviceutil.ServiceFramework):
_svc_name_ = 'MyService'
_svc_display_name_ = 'My Service'
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ''))
self.main()
def main(self):
while True:
try:
subprocess.check_output(['tasklist', '/FI', 'IMAGENAME eq a.exe'])
except subprocess.CalledProcessError as e:
# a.exe is not running
pass
else:
# a.exe is running
pass
# Wait for 5 seconds before checking again
win32event.WaitForSingleObject(self.hWaitStop, 5000)
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(MyService)
```
此代码定义了一个名为"MyService"的Windows服务类,它继承自win32serviceutil.ServiceFramework。你可以根据实际需要更改服务名称和显示名称。
在主循环(main())中,使用subprocess模块调用tasklist命令来检测a.exe程序是否正在运行。如果找不到a.exe进程,则说明a.exe没有启动。
最后,在命令提示符中以管理员身份运行以下命令来安装该服务:
```
python service.py install
```
然后,可以使用以下命令来启动该服务:
```
python service.py start
```
这个服务将在后台持续检测a.exe程序有没有启动。如果要停止服务,可以使用以下命令:
```
python service.py stop
```
希望对你有所帮助!
阅读全文