生產級部署 Python 腳本,崩潰可自啓!

今天介紹一個生產級的流程管理工具 PM2,一般咱們說到 PM2 的時候,都是在說如何部署 Node.js 程序,可是實際上 PM2 很強大,不單單能夠用來管理 Node.js,它還能夠用來管理 Python、PHP、Ruby、perl 等等。javascript

這裏就以 Python 舉例子,來看看 PM2 如何部署管理 Python 腳本。php

PM2-Python

PM2 是一個生產級流程管理器,能夠輕鬆管理後臺進程,在 Python 的世界中,PM2 是能夠和 Supervisord 相媲美的,而且 PM2 還有一些很是棒的功能。java

使用 PM2,讓崩潰重啓、觀察、檢查日誌甚至部署應用程序,都變的簡單,而且 PM2 很是重視在命令行界面的操做體驗,所以 PM2 很是易於使用和掌握。node

PM2 發展到今天,已經 5 年了,在 Github 上有超過 6500w 次下載,已經成爲在生產服務器中運行 Node.js 的首選方式之一。可是它也支持 Python。python

安裝 PM2

PM2 依賴於 Node.js,因此須要提早安裝 Node,這一步很是簡單:npm

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs
複製代碼

其餘平臺如何安裝 Node.js,可自行查找教程。小程序

有了 Node 的環境後,就能夠經過 npm 來安裝 PM2 了。ruby

$ sudo npm install pm2 -g
複製代碼

要初始化 PM2 ,可使用 pm2 ls 命令,此時就能夠看到一個很友好的界面。bash

如今,已經成功安裝好 PM2 了,讓咱們啓動一個 Python 應用吧。服務器

啓動 Python

使用 PM2 啓動應用很是的簡單,它講根據腳本擴展自動匹配解釋器,用以運行指定的應用程序。

咱們先建立一個簡單的 Python 應用程序,例如:hello.py。

#!/usr/bin/python
import time

while 1:
    print("Start: %s" % time.ctime())
    time.sleep(1)
複製代碼

咱們有了一個簡單的 Python 腳本,接下來咱們就用 PM2 去啓動它。

$ pm2 start hello.py
複製代碼

而後在 Terminal 裏就能夠看到該進程了。

到這一步,這個 Python 程序就將永遠的運行下去,這意味着若是該進程退出或者拋出異常,它將被自動重啓。

此處的 mode 爲 fork,也就是關閉當前的 Terminal 窗口,它依然能夠檢查到此應用的狀態。

想要查看 PM2 運行管理的應用程序,可使用 pm2 ls 命令進行查看。

檢查日誌

經過 PM2 運行的程序,若是想要查看 Log,能夠輸入 pm2 logs 命令。

若是想要指定查看某個進程的 Log,可使用 pm2 logs <app_name> 進行指定。

另外 PM2 還提供了自動化的日誌輪換功能,可是須要安裝 pm2-logrotate

$ pm2 install pm2-logrotate
複製代碼

pm2-logrotate 將提供天天日誌輪換更新的功能,並保持總的日誌控件大小爲 10M。

查看某進程的信息

想要查看當前使用 PM2 啓動的程序的詳細信息,可使用 pm describe <app_name> 命令進行查看。

在輸出中,能夠看到日誌文件的路徑,已經解釋器等信息。

管理 PM2 的進程狀態

介紹完啓動和查看日誌,再看幾個簡單的管理命令。

1. 中止某個程序

$ pm2 stop hello
複製代碼

2. 重啓某個程序

$ pm2 restart hello
複製代碼

3. 從進程列表中中止和刪除某個程序

$ pm2 delete hello
複製代碼

更多的命令,能夠直接查看官方文檔。

服務器重啓時,依然保持運行

使用 PM2 啓動 Python 程序以後,PM2 只能保證啓動的這個 Python 程序發生意外崩潰的時候,對他進行重啓。若是你但願在重啓服務器的時候,依然保持應用程序在線,則須要設置 init 腳本,用以告訴系統啓動 PM2 以及你的應用程序。

想讓 PM2 跟隨系統啓動,只須要運行此命令。

$ pm2 startup
複製代碼

startup 能夠生成一個設置環境變量的命令。

截图 - ä"Ž -  2018-09-19-13-05-39
截图 - ä"Ž - 2018-09-19-13-05-39

複製/粘貼此命令的最後一行,執行後將在系統重啓時,自動啓動 PM2。

如今已經能夠重啓 PM2 了,還須要告訴 PM2 那些進程狀態須要在重啓時保持不變,只須要輸入命令:

$ pm2 save
複製代碼

這將建立一個轉存文件,記錄當前由 PM2 管理的進程狀態,PM2 將在重啓時,按照以前的狀態恢復他們。

監聽 CPU/內存信息

要監聽 CPU/內存並檢查有關進程的一些信息,須要使用 pm2 monit 命令。

這將打開一個 termcaps 界面,容許試試瞭解正在運行的應用程序。

你還可使用 pm2 show <app_name> 獲取有關應用程序的全部可能信息。

使用 Ecosystem 文件

若是有多個程序須要啓動,或者在啓動的時候須要傳遞不一樣的參數、選項等,可使用 eocsystem 文件對應用程序進行配置。

Eocsystem 須要經過 ecosystem.config.js 文件進行配置,此文件能夠經過 pm2 init 命令生成。生成好後,咱們能夠在其中配置一些配置信息。

module.exports = {
  apps : [{
    name'echo-python',
    cmd'hello.py',
    args'arg1 arg2',
    autorestartfalse,
    watchtrue,
    pid'/path/to/pid/file.pid',
    instances4,
    max_memory_restart'1G',
    env: {
      ENV'development'
    },
    env_production : {
      ENV'production'
    }
  }, {
    name'echo-python-3',
    cmd'hello.py',
    interpreter'python3'
  }]
};
複製代碼

在這個例子中,咱們聲明瞭兩個應用程序,經過 interpreter 配置程序啓動的解釋器,一個使用 Python2 (默認)運行,另外一個使用 Python3 運行。

啓動它,依然使用 pm2 start 命令。

$ pm2 start ecosystem.config.js
複製代碼

想要單獨重啓 「production」 (env_production):

$ pm2 restart ecosystem.config.js --env production
複製代碼

Ecosystem.config.js 文件中,不少配置都是能夠經過命令來指定,例如,能夠經過 --interpreter 來指定解析程序。

一般咱們會同時安裝 Python2.x 和 Python3.x 的環境,而 PM2 在默認狀況下,是經過腳本文件後綴來判斷的,若是沒有後綴就須要強制指定 --interpreter

{
  ".sh""bash",
  ".py""python",
  ".rb""ruby",
  ".coffee" : "coffee",
  ".php""php",
  ".pl" : "perl",
  ".js" : "node"
}
複製代碼

這些配置信息也標記了 PM2 支持的腳本程序。

那麼若是須要使用 Python3.x 來執行某個腳本,就須要 --interpreter 了。

$ pm2 start hello.py --interpreter=python3
複製代碼

小結

PM2 的簡單使用,就先介紹到這裏。雖然這裏使用 Python 來舉例,可是本文全部相關命令,是能夠適用其餘 PM2 支持的腳本程序。

PM2 還有不少強大的功能,好比說利用 SSH 輕鬆部署到服務器、負載均衡等等都是一些不錯的功能,有興趣能夠查閱文檔。PM2 文檔很健全,大部分問題均可以在文檔中找到答案。

有任何問題,歡迎在留言區討論,有用就分享吧,謝謝!

參考:

https://blog.pm2.io/managing-python-application-with-pm2

https://pm2.io/doc/en/runtime/quick-start/

公衆號後臺回覆成長『成長』,將會獲得我準備的學習資料,也能回覆『加羣』,一塊兒學習進步;你還能回覆『提問』,向我發起提問。

推薦閱讀:

圖解 Chrome,架構篇 | 利用預處理腳本,管理小程序代碼| 分詞,科普及解決方案| 圖解:HTTP 範圍請求 | 小程序學習資料 |HTTP 內容編碼 | 輔助模式實戰 | 輔助模式玩出花樣 | 小程序 Flex 佈局

相關文章
相關標籤/搜索