Windows環(huán)境中Python應(yīng)用服務(wù)自啟動及其監(jiān)控問題
需求描述
- 在windows服務(wù)器環(huán)境中,python應(yīng)用服務(wù)在服務(wù)器重啟時,能自動啟動;
- 在任務(wù)管理器中,能區(qū)分監(jiān)控python應(yīng)用服務(wù)(默認(rèn)都是python的情況,無法區(qū)分多個python進(jìn)程);
- 監(jiān)控python應(yīng)用服務(wù)進(jìn)程,當(dāng)應(yīng)用服務(wù)掛掉后,重新啟動服務(wù)。
1. Python應(yīng)用服務(wù)自啟動
1.1. 啟動時運行批處理文件
Windows 10/Windows Server 201X具有一個名為“啟動”的已知文件夾,系統(tǒng)每次啟動開始自動運行應(yīng)用程序、快捷方式和腳本時都會檢查該文件夾,而無需額外配置。
要在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. 使用任務(wù)計劃程序運行批處理文件
使用任務(wù)計劃程序在特定時間自動運行批處理文件。

1.3. 注冊服務(wù)
注冊服務(wù)的優(yōu)勢就在于可以開機自啟動,而在windows上,python不能直接將腳本注冊為服務(wù),需要將其先打包成exe,再將exe注冊為服務(wù)。
打包exe,使用pyinstaller打包,安裝好pyinstaller包后,在cmd/pycharm的終端里運行如下代碼打包。
2. 應(yīng)用服務(wù)監(jiān)控
2.1. 自定義python腳本在windows下的進(jìn)程名
在windows環(huán)境中,部署多個python應(yīng)用服務(wù)時,在任務(wù)管理器中監(jiān)控進(jìn)程時,任務(wù)名稱都是python.exe,無法識別是哪個具體任務(wù),造成維護(hù)困難。

簡單解決方法是按需拷貝(copy)python.exe文件(python.exe大小只有100k),然后重命名成為pvforecast_py.exe(或者隨便你想要的名字),然后你寫一個批處理文件,內(nèi)容是start python_myapp1.exe myapp.py。
然后你運行批處理文件,你就會發(fā)現(xiàn)在任務(wù)管理器中的詳細(xì)信息頁面中出現(xiàn)了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. 守護(hù)進(jìn)程
有時會遇到斷網(wǎng)、硬件設(shè)備掉線等情況,需要重新啟動服務(wù),覺得較為麻煩。想仿照linux下的腳本,寫一個windows下的腳本,守護(hù)進(jìn)程,自動檢查自啟動,或發(fā)出報警。
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 ###如果存在該進(jìn)程 if %errorlevel%==0 ( ###如果不存在,則自行啟動 start pvforecast_py.exe ****.py
3. 把應(yīng)用程序與批處理文件加入到安全白名單中
加入到白名單中的文件目錄,文件,安全防護(hù)工具將信任該軟件,可以直接使用。
以360安全衛(wèi)士為例,在信任區(qū)添加python文件目錄,以及啟動文件夾中的批處理文件。

4. 實踐方案
最初,使用任務(wù)計劃程序方式,自動啟動python應(yīng)用服務(wù),由于受到安全衛(wèi)士的阻止,沒有找到易操作維護(hù)任務(wù)計劃程序方式,現(xiàn)改為在啟動中部署自動啟動python用于服務(wù),以及增加監(jiān)控方法,提高運維效率。
最后的批處理文件(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"
以管理員身份進(jìn)入CMD命令行窗口:
D:\>buildw.bat
相關(guān)批處理命令解釋如下:
注:在 Windows 批處理中,如果路徑中含有中文字符,可能會出現(xiàn)亂碼的情況。
在批處理文件開頭添加以下語句:
chcp 65001
這個命令可以將命令行窗口的字符編碼設(shè)置為 UTF-8,從而支持中文字符。
注:如果文件路徑中含有空格,則批處理命令中,使用雙引號引起來。
5. 其他
也可以使用所有用戶的啟動目錄:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
用管理員權(quán)限用戶啟動目錄,所有用戶的啟動目錄,批處理都執(zhí)行。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
pycharm如何debug for循環(huán)里面的錯誤值(推薦)
一般debug時,在for循環(huán)里面的話,需要自己一步一步點,如果循環(huán)幾百次那種就比較麻煩,此時可以采用try except的方式來解決,這篇文章主要介紹了pycharm如何debug for循環(huán)里面的錯誤值,需要的朋友可以參考下2024-07-07
手把手教你如何使python變?yōu)榭蓤?zhí)行文件
對于exe可執(zhí)行文件,相信大家都不陌生,下面這篇文章主要給大家介紹了關(guān)于如何使python變?yōu)榭蓤?zhí)行文件的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
Python3.4學(xué)習(xí)筆記之 idle 清屏擴展插件用法分析
這篇文章主要介紹了Python3.4 idle 清屏擴展插件用法,簡單分析了idle清屏的幾種方法及idle清屏插件的相關(guān)使用技巧,需要的朋友可以參考下2019-03-03

