今天介紹一個生產級的流程管理工具 PM2,一般咱們說到 PM2 的時候,都是在說如何部署 Node.js 程序,可是實際上 PM2 很強大,不單單能夠用來管理 Node.js,它還能夠用來管理 Python、PHP、Ruby、perl 等等。javascript
這裏就以 Python 舉例子,來看看 PM2 如何部署管理 Python 腳本。php
PM2 是一個生產級流程管理器,能夠輕鬆管理後臺進程,在 Python 的世界中,PM2 是能夠和 Supervisord 相媲美的,而且 PM2 還有一些很是棒的功能。java
使用 PM2,讓崩潰重啓、觀察、檢查日誌甚至部署應用程序,都變的簡單,而且 PM2 很是重視在命令行界面的操做體驗,所以 PM2 很是易於使用和掌握。node
PM2 發展到今天,已經 5 年了,在 Github 上有超過 6500w 次下載,已經成爲在生產服務器中運行 Node.js 的首選方式之一。可是它也支持 Python。python
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 應用吧。服務器
使用 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>
命令進行查看。
在輸出中,能夠看到日誌文件的路徑,已經解釋器等信息。
介紹完啓動和查看日誌,再看幾個簡單的管理命令。
1. 中止某個程序
$ pm2 stop hello
複製代碼
2. 重啓某個程序
$ pm2 restart hello
複製代碼
3. 從進程列表中中止和刪除某個程序
$ pm2 delete hello
複製代碼
更多的命令,能夠直接查看官方文檔。
使用 PM2 啓動 Python 程序以後,PM2 只能保證啓動的這個 Python 程序發生意外崩潰的時候,對他進行重啓。若是你但願在重啓服務器的時候,依然保持應用程序在線,則須要設置 init 腳本,用以告訴系統啓動 PM2 以及你的應用程序。
想讓 PM2 跟隨系統啓動,只須要運行此命令。
$ pm2 startup
複製代碼
startup
能夠生成一個設置環境變量的命令。
複製/粘貼此命令的最後一行,執行後將在系統重啓時,自動啓動 PM2。
如今已經能夠重啓 PM2 了,還須要告訴 PM2 那些進程狀態須要在重啓時保持不變,只須要輸入命令:
$ pm2 save
複製代碼
這將建立一個轉存文件,記錄當前由 PM2 管理的進程狀態,PM2 將在重啓時,按照以前的狀態恢復他們。
要監聽 CPU/內存並檢查有關進程的一些信息,須要使用 pm2 monit
命令。
這將打開一個 termcaps 界面,容許試試瞭解正在運行的應用程序。
你還可使用 pm2 show <app_name>
獲取有關應用程序的全部可能信息。
若是有多個程序須要啓動,或者在啓動的時候須要傳遞不一樣的參數、選項等,可使用 eocsystem 文件對應用程序進行配置。
Eocsystem 須要經過 ecosystem.config.js 文件進行配置,此文件能夠經過 pm2 init
命令生成。生成好後,咱們能夠在其中配置一些配置信息。
module.exports = {
apps : [{
name: 'echo-python',
cmd: 'hello.py',
args: 'arg1 arg2',
autorestart: false,
watch: true,
pid: '/path/to/pid/file.pid',
instances: 4,
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 佈局