Windows环境中Python应用服务自启动及其监控问题

 更新时间:2024年06月26日 15:31:16   作者:时尚IT男  
这篇文章主要介绍了Windows环境中Python应用服务自启动及其监控问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

需求描述

  • 在windows服务器环境中,python应用服务在服务器重启时,能自动启动;
  • 在任务管理器中,能区分监控python应用服务(默认都是python的情况,无法区分多个python进程);
  • 监控python应用服务进程,当应用服务挂掉后,重新启动服务。

1. Python应用服务自启动

1.1. 启动时运行批处理文件

Windows 10/Windows Server 201X具有一个名为“启动”的已知文件夹,系统每次启动开始自动运行应用程序、快捷方式和脚本时都会检查该文件夹,而无需额外配置。

要在Windows启动时运行脚本,先使用Windows+R快捷键打开“运行”对话框。

键入命令:shell:startup

C:\Users\xiaoyw\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

写段测试代码,做成批处理,放到“启动”文件夹下。

批处理,命名为startup.bat:

d:
cd \01workspace\study
python TestStartup.py

python示例代码:

import datetime

now = datetime.datetime.now()
dtime = now.strftime("%Y-%m-%d %H:%M:%S")
print('延迟时间是:', dtime)

with open('startup.txt','w') as f:
    f.write(dtime + ", test ok!")

1.2. 使用任务计划程序运行批处理文件

使用任务计划程序在特定时间自动运行批处理文件。

1.3. 注册服务

注册服务的优势就在于可以开机自启动,而在windows上,python不能直接将脚本注册为服务,需要将其先打包成exe,再将exe注册为服务。

打包exe,使用pyinstaller打包,安装好pyinstaller包后,在cmd/pycharm的终端里运行如下代码打包。

2. 应用服务监控

2.1. 自定义python脚本在windows下的进程名

在windows环境中,部署多个python应用服务时,在任务管理器中监控进程时,任务名称都是python.exe,无法识别是哪个具体任务,造成维护困难。

简单解决方法是按需拷贝(copy)python.exe文件(python.exe大小只有100k),然后重命名成为pvforecast_py.exe(或者随便你想要的名字),然后你写一个批处理文件,内容是start python_myapp1.exe myapp.py。

然后你运行批处理文件,你就会发现在任务管理器中的详细信息页面中出现了python_myapp1.exe。

python.exe大小只有几十k,多copy几个也无所谓。比起build成exe还是简单很多。

批处理文件名称为PVForecastAPScheduler.bat,代码如下:

@echo off
D:
cd D:\Python\PVMicrogrid\PVSystem
start pvforecast_py PVForecastAPScheduler.py

测试验证代码如下:

import datetime
import pytz
from apscheduler.schedulers.blocking import BlockingScheduler

def test():
    now = datetime.datetime.now()
    dtime = now.strftime("%Y-%m-%d %H:%M:%S")
    print('延迟时间是:', dtime)

    with open('startup1.txt','w') as f:
        f.write(dtime + ", test ok!")
    
scheduler = BlockingScheduler(timezone=pytz.timezone("Asia/Shanghai") )


scheduler.add_job(test, 'cron', second='10', misfire_grace_time=60, id='job1')
try:
    scheduler.start()
except (KeyboardInterrupt, SystemExit):
    pass  

2.2. 守护进程

有时会遇到断网、硬件设备掉线等情况,需要重新启动服务,觉得较为麻烦。想仿照linux下的脚本,写一个windows下的脚本,守护进程,自动检查自启动,或发出报警。

windows下的脚本为monitor.bat文件,下面以启动***.exe文件为例:

@echo off
:start
choice /t 5 /d y /n >nul
tasklist|find /i "pvforecast_py.exe"
if %errorlevel%==0 (
echo "yes"
) else (
echo "No"
start pvforecast_py.exe  ****.py
)
goto start

其中,

	###定时5s
	choice /t 5 /d y /n >nul     
	 ###如果存在该进程
	if %errorlevel%==0 ( 
	###如果不存在,则自行启动
	start pvforecast_py.exe  ****.py

3. 把应用程序与批处理文件加入到安全白名单中

加入到白名单中的文件目录,文件,安全防护工具将信任该软件,可以直接使用。

以360安全卫士为例,在信任区添加python文件目录,以及启动文件夹中的批处理文件。

4. 实践方案

最初,使用任务计划程序方式,自动启动python应用服务,由于受到安全卫士的阻止,没有找到易操作维护任务计划程序方式,现改为在启动中部署自动启动python用于服务,以及增加监控方法,提高运维效率。

最后的批处理文件(buildw.bat)如下:

chcp 65001
copy d:\python\python38\python.exe d:\python\python38\pvforecast_py.exe
copy d:\python\python38\python.exe d:\python\python38\pvweather24_py.exe
copy d:\python\python38\python.exe d:\python\python38\pvweather_py.exe
copy d:\python\python38\python.exe d:\python\python38\pvenergy_py.exe

copy D:\Python\PVMicrogrid\PVSystem\PVForecastAPScheduler.bat "%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\PVForecastAPScheduler.bat"
copy D:\Python\PVMicrogrid\PVSystem\PVTrainAPScheduler.bat "%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\PVTrainAPScheduler.bat"
copy D:\Python\PVMicrogrid\PVSystem\PVAPScheduler.bat "%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\PVAPScheduler.bat"
copy D:\Python\PVMicrogrid\EnergyOptimization\EnergyAPScheduler.bat "%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\EnergyAPScheduler.bat"

以管理员身份进入CMD命令行窗口:

D:\>buildw.bat

相关批处理命令解释如下:

注:在 Windows 批处理中,如果路径中含有中文字符,可能会出现乱码的情况。

在批处理文件开头添加以下语句:

chcp 65001

这个命令可以将命令行窗口的字符编码设置为 UTF-8,从而支持中文字符。

注:如果文件路径中含有空格,则批处理命令中,使用双引号引起来。

5. 其他

也可以使用所有用户的启动目录:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

用管理员权限用户启动目录,所有用户的启动目录,批处理都执行。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • pycharm如何debug for循环里面的错误值(推荐)

    pycharm如何debug for循环里面的错误值(推荐)

    一般debug时,在for循环里面的话,需要自己一步一步点,如果循环几百次那种就比较麻烦,此时可以采用try except的方式来解决,这篇文章主要介绍了pycharm如何debug for循环里面的错误值,需要的朋友可以参考下
    2024-07-07
  • 这三个好用的python函数你不能不知道!

    这三个好用的python函数你不能不知道!

    作为21世纪最流行的语言之一,Python当然有很多有趣的功能值得深入探索和研究.今天通过理论和实际例子来讨论,需要的朋友可以参考下
    2021-06-06
  • pycharm console 打印中文为乱码问题及解决

    pycharm console 打印中文为乱码问题及解决

    这篇文章主要介绍了pycharm console 打印中文为乱码问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • python 发送和接收ActiveMQ消息的实例

    python 发送和接收ActiveMQ消息的实例

    今天小编就为大家分享一篇python 发送和接收ActiveMQ消息的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • 手把手教你如何使python变为可执行文件

    手把手教你如何使python变为可执行文件

    对于exe可执行文件,相信大家都不陌生,下面这篇文章主要给大家介绍了关于如何使python变为可执行文件的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • python解析xml文件实例分析

    python解析xml文件实例分析

    这篇文章主要介绍了python解析xml文件的方法,实例分析了Python针对XML文件节点及字段的获取技巧,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • Python asyncio的一个坑

    Python asyncio的一个坑

    这篇文章主要介绍了Python asyncio的一个坑,文章从Python编程错误开始介绍,改变与好多变不成中常犯的错误,我们今天就来分析分析吧,需要的下伙伴也可以参考一下
    2021-12-12
  • Python中实现常量(Const)功能

    Python中实现常量(Const)功能

    这篇文章主要介绍了Python中实现常量(Const)功能,python语言本身没有提供const,本文使用一个类来实现常量定义功能,并介绍了使用方法,需要的朋友可以参考下
    2015-01-01
  • Python3.4学习笔记之 idle 清屏扩展插件用法分析

    Python3.4学习笔记之 idle 清屏扩展插件用法分析

    这篇文章主要介绍了Python3.4 idle 清屏扩展插件用法,简单分析了idle清屏的几种方法及idle清屏插件的相关使用技巧,需要的朋友可以参考下
    2019-03-03
  • Python中if-else的语法用法示例代码

    Python中if-else的语法用法示例代码

    Python中的if-else决策控制是重要的一种流程控制,顾名思,Python中的决策允许我们为特定决策运行特定的代码块,这篇文章主要介绍了Python中if-else语法用法的相关资料,需要的朋友可以参考下
    2025-07-07

最新评论