博客 / 詳情

返回

使用PM2實現python flask後台保活、進程管理

  • 項目背景:由於某些功能簡單的腳本文件並不需要寫圖形化界面;或者沒有時間或精力開發和維護圖形化界面(但是這些腳本代碼又需要在後台運行,就比如在windows直接運行代碼需要cmd前台窗口界面或者vscode啓動;關掉前台窗口就無法後台運行代碼;不關閉前台窗口程序又佔用大量內存)所以這使得 PM2 成為一個既高效又易於管理的解決方案。
  • 簡單介紹:PM2基於nodejs,但是它又可以管理其他類型的代碼腳本。並且PM2可以多平台使用
  • 參考資料:

    • PM2文檔
    • 用 PM2 做 Python 進程管理也太好用了吧
    • pm2 進程守護python flask
    • PM2實用指南、PM2詳解、PM2輕鬆實現腳本後台執行、Node如何在後台運行、如何讓npm start 在後台運行
    • PM2中文教程
    • windows設置pm2開機服務自啓動nodejs項目

1.PM2的安裝

PM2依賴於nodejs,所以我們首先來安裝nodejs。由於我的運行平台是windows,所以直接打開官網下載.msi格式安裝包。下載之後直接安裝即可(記得選擇想要的版本和X64)
image.png

安裝之後,打開終端輸入以下命令檢查安裝情況是否正常,如果能輸出版本號,説明 Node.js 和 npm 安裝正常

node -v
npm -v

接着終端運行以下命令將 PM2 安裝到全局:

npm install -g pm2

安裝之後,打開終端輸入以下命令檢查安裝情況是否正常,如果能輸出版本號,説明 PM2 安裝正常

pm2 -v

2.PM2的創建應用操作和常規使用例子

先來介紹一下PM2的創建應用操作(以及相關參數):

# 給這個任務起名
--name {job_name} 或者 -n {job_name}

# 文件更新時自動重啓任務
--watch

# 開啓多進程
-i {num}

# 設置應用重新加載的內存閾值
--max-memory-restart <200MB>

# 定義日誌路徑
--log {log_path}

# 腳本額外參數
-- arg1 arg2 arg3

# 默認情況PM2自動重啓應用。該命令禁用自動重啓功能,即使應用因為崩潰或錯誤退出
--no-autorestart

# 設置cron定時任務
--cron {定時表達式}

上面的應用啓動操作具體怎麼寫取決於你的使用場景,拿我的使用來舉個例子:比如使用PM2啓動一個flask代碼,並將其命名為 flask_app

pm2 start "C:\Users\QINXIN\AppData\Local\Programs\Python\Python310\pythonw.exe" --name "flask_app" -- "C:\02-文檔\python學習\my_toys\18_錄音轉文本\flask.py" --no-autorestart
  • "C:\Users\QINXIN\AppData\Local\Programs\Python\Python310\pythonw.exe"是解釋器的具體路徑,由於我這裏需要python flask代碼無窗口運行,所以需要指定使用pythonw.exe來當解釋器而非使用python.exe,否則會彈出前台窗口(關閉前台窗口則flask無法運行)
  • --name "flask_app" 是給你的應用命名,方便管理。注意不要寫中文,否則後續進程會出錯
  • -- "C:\02-文檔\python學習\my_toys\18_錄音轉文本\flask.py" 是代碼路徑,可以指定具體的路徑,注意:--後面帶有空格,再接代碼路徑!!
  • --no-autorestart 是禁用自動重啓功能,即使應用因為崩潰或錯誤退出。

3.PM2的常用命令

前面提到的PM2的應用啓動操作只是PM2命令的一個,其他常用命令還有:

  • 檢查 PM2 運行狀態

    pm2 list

    終端會進行以下輸出,顯示你創建的各種應用:

    ┌───────┬────────────┬──────┬─────┬──────────┬───────┬────────┐
    │ Name  │ id         │ mode │ pid │ status   │ cpu   │ mem    │
    ├───────┼────────────┼──────┼─────┼──────────┼───────┼────────┤
    │ flask │ 0          │ fork │ 1234│ online   │ 0.1%  │ 20MB   │
    └───────┴────────────┴──────┴─────┴──────────┴───────┴────────┘
  • 停止應用

    pm2 stop 應用名
    pm2 stop [id]
    pm2 stop all
  • 重啓應用

    pm2 restart 應用名
    pm2 restart [id]
    pm2 restart all
  • 刪除應用

    pm2 delete 應用名
    pm2 delete [id]
    pm2 delete all
  • 查看應用日誌

    pm2 logs
  • 確保 PM2 在系統重啓後自動啓動

    pm2 startup
  • 持久化你的進程列表,重啓後自動恢復進程,默認情況下,PM2 在重啓或者服務器關閉時,不會自動恢復你之前運行的進程。pm2 save 命令會將當前運行的進程列表和它們的配置信息保存到一個 dump 文件(通常是 ~/.pm2/dump.pm2)

    pm2 save
  • 恢復之前通過 pm2 save 命令保存的進程列表(通過 pm2 save 命令)如果你在系統重啓後需要手動恢復所有進程,可以使用它。就像一個快照,記錄了你當前運行的所有應用以及它們的配置,下次啓動時直接恢復到這個快照狀態。

    pm2 resurrect

4.PM2 在windows上開機自啓動服務

以前往往使用pm2-windows-service這種模塊,但我看了一下這個庫已經很久不維護並且試過不太成功。所以推薦以下方法

使用"任務計劃程序"調用批處理文件 (.bat) 或 PowerShell 腳本 (.ps1),背後的流程原理是:當你windows開機之後,nodejs被自啓動,然後任務計劃程序被設置在nodejs啓動之後的一段時間內調用cmd或powershell發送pm2 resurrect命令,恢復之前通過pm2 save命令保存的進程列表

  • 也就是説首先你要確保nodejs是能夠自啓動的,並且pm2命令已經正確地添加到了系統環境變量中
  • 接着執行pm2 startup命令開啓自啓動,然後執行pm2 save保存一份快照以便下次啓動時自動恢復進程
  • 然後創建pm2_resurrect.bat的文件,內容如下,自己保存到合適位置

    @echo off
    pm2 resurrect
    exit
  • 打開 "任務計劃程序",創建新任務,觸發器設置為 "計算機啓動時"。操作中選擇 "啓動程序","程序/腳本" 瀏覽到您的 pm2_resurrect.bat 文件。在任務屬性的 "常規" 選項卡中,勾選 "使用最高權限運行"。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.