進程守護
由於nodejs的單線程的脆弱性,一旦遇到運行錯誤便會嚴重到退出node進程導致系統或應用癱瘓,所以pm2,forever出現了,幫助我們實現進程的重啟,這只是他們的特性之一。
實例演示進程退出
遇到錯誤,進程退出。
var http = require('http');
var server = http.createServer((req, res) => {
if(req.url === '/zqz'){
throw 'req Error';
}
res.end('Hello world!');
}).listen('80', 'localhost', () => {
console.log('Server running...');
});
我們請求localhost:80
$ node app.js
Server running...
使用curl來請求:
$ curl localhost:80
Hello world!
請求沒有問題。這時候我們在請求localhost:80/zqz
$ curl localhost:80/zqz
curl: (56) Recv failure: Connection reset by peer
妥妥的進程報錯:
C:\Users\Administrator\Desktop\pm2\app.js:5
throw 'req Error';
^
req Error
使用pm2守護
我們使用pm2來守護app.js。
使用pm2 start app.js命令運行:
$ pm2 start app.js
[PM2] Starting C:\Users\Administrator\Desktop\pm2\app.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ app │ 0 │ fork │ 3968 │ online │ 0 │ 0s │ 6% │ 15.4 MB │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
再次請求localhost:80/zqz
$ curl localhost:80/zqz
curl: (56) Recv failure: Connection reset by peer
沒錯照樣是報錯,但是看下面。
$ curl localhost:80
Hello world!
沒錯,雖然有個請求報錯了,但是當我們再次請求對的url的時候,依舊可以獲取到數據。
這就是守護,一旦失敗立即重啟。
查看logs
上面的操作雖然重啟了進程,但是我們看不到一些變化的東西終歸是不放心。
所以這里我們來查看一下log。看下是不是跟我們想的一樣。
pm2 logs app
0|app | Server running...
[STREAMING] Now streaming realtime logs for [app] process
0|app | req Error
0|app | Server running...
第一個是我們第一次啟動的時候的輸出。
第二個是我們請求錯誤鏈接的時候的輸出。
第三個是pm2自動啟動進程的輸出。
這下是不是放心了?哈哈!