利用Windows的命令行工具tasklist和findstr,start结合计划任务实现一种进程监控的方案...

Windows虽然是以UI来见长的。但是,真正的POWERFUL工具,还是命令行的。

今天,介绍一种利用Windows命令行工具 tasklist 和 findstr, start 来实现监控某个进程是否正常工作的方案。

tasklist :列出系统当前执行的所有进程;

findtr   :利用正则表达式的方式,在字符串或文本文件中搜索指定的内容;

start    :用某些参数限定的模式启动一个目标

同时,还要用到命令行里的 通道 | ,这个可是个supper channel。

方案如下:

假设有一个服务进程, 叫botserver,此服务允许短暂的不可用,假设 5 分钟;

这个botserver在发生异常时,将自动退出;

为了保证这个进程能持续的提供服务,我们建立一个 BAT 批处理文件,将其加入到系统的 计划任务 中,设定执行周期为3分钟;

在BAT文件中,写入如下的内容:

tasklist | findstr /i botserver.exe

IF ERRORLEVEL 1 start /b botserver.exe

 

tasklist | findstr /i botserver.exe 是在系统进程列表中,查找 botserver.exe

IF ERRORLEVEL 1 start /b botserver.exe 如果上面的查找没有匹配,则启动 botserver.exe

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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 ``` 希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值