開機自動執行腳本
vi /etc/rc.local
"/etc/rc.local" [readonly] 16L, 416C 14,58-41 All
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
echo "看到這行字,說明添加自啟動腳本成功~" > /usr/local/test.log
sh /home/ubuntu/git_pull.sh
exit 0
sudo chown root:root /etc/rc.local
sudo chmod 755 /etc/rc.local
sudo systemctl enable rc-local.service
PM2
安裝
npm install pm2@latest -g
CLI
pm2 start xxx.json
pm2 restart xxx.json
pm2 stop xxx.json
pm2 list
pm2 del ${id}
pm2 logs
# 靜態檔的服務器
`pm2 serve <path> <port>`
JSON 格式
更多監控配置 http://pm2.keymetrics.io/docs/usage/watch-and-restart/
{
"name": "manage", //專案名稱
"script": "./bin/www", //要執行的腳本
"cwd":"./", //專案目錄
"watch":[ // [] 添加要監控的檔案,有更新就自動重啟
"models",
"routes"
],
"ignore_watch" : [ //不監控的檔案
"node_modules",
"client/img"
],
"watch_options": { // 更多設定 http://pm2.keymetrics.io/docs/usage/watch-and-restart/
"followSymlinks": false
}
}
{
"apps": [
{
"name": "METAMERCE_APP",
"script": "./metamerce",
"args": [
"app"
],
"ignore_watch": [
"stdout.log",
"logs"
],
"log_date_format": "YYYY-MM-DD HH:mm",
"merge_logs": true,
"watch": false
}
]
}
啟動可以附加的參數
- --name 指定 app 一個名字
- --watch 檔案有變更時,會自動重新啟動
- --max-memory-restart Memory 使用超過這個門檻時,會自動重啟
- --log 指定 log 的位址, 若要指定新位址,需將原本的 process 刪掉,再重新啟動指定
- --output 指定 output log 位址
- --error 指定 error log 位址
- --log-date-format 指定 log 的格式
- --merge-logs 同一個 app 跑多程序時,不要依據程序 id 去分割 log, 全部合在一起
- --arg1 --arg2 --arg3 指派額外的參數
- --restart-delay 自動重啟時,要 delay 多久
- --time 給 log 加上前綴
- --no-autorestart 不要自動重啟
- --cron 指定 cron 規律,強制重啟
- --no-daemon 無 daemon 模式, listen log 模式
- --spa 限定 serve 使用, 會重導所有的請求到 index.html
- --basic-auth-username --basic-auth-password 用於靜態檔, 讓該頁面需要帳號密碼方可存取
開機自動啟動
- 產生開機 script
pm2 startup - 取消開機自動重啟
pm2 unstartup - 儲存下次重啟時,預設啟動的 process
pm2 save - 如果有更新 node 的版本,記得更新 script
pm2 unstartup && pm2 startup && pm2 save
常用指令
# Fork 模式
pm2 start app.js --name my-api # 指定程序名稱
# Cluster 模式
pm2 start app.js -i 0 # 會根據可用的 CPU 數量來啟動最大的程序數量,達到平衡負載的效果
pm2 start app.js -i max # 跟上面一樣,但是廢除了
pm2 scale app +3 # 增加三個 worker
pm2 scale app 2 # 將 worker 更新成兩個
# 狀態顯示
pm2 list # 顯示所有程序狀態
pm2 jlist # 將程序狀態使用 raw JSON 印出
pm2 prettylist # 將程序狀態用美化的 JSON 印出
pm2 describe 0 # 顯示特定程序的所有資訊
pm2 monit # 監控所有程序
# Logs
pm2 logs [--raw] # 以串流的方式顯示所有 log
pm2 flush # 移除所有 log 檔案
pm2 reloadLogs # 重新載入 logs
# 操作
pm2 stop all # 停止所有程序
pm2 restart all # 重新開啟所有程序
pm2 reload all # 重新載入服務
pm2 stop 0 # 停止特定 id 的程序
pm2 restart 0 # 重新啟動特定 id 程序
pm2 delete 0 # 從 pm2 list 移除特定 id 程序, 但這並不會停止該程序
pm2 delete all # 移除所有程序, 但這並不會停止這些程序
# Misc
pm2 reset <process> # 重置 meta data
pm2 updatePM2 # 更新 pm2
pm2 ping # Ensure pm2 daemon has been launched
pm2 sendSignal SIGUSR2 my-app # Send system signal to script
pm2 start app.js --no-daemon # 不要背景執行
pm2 start app.js --no-vizion # 不加這一行,預設執行 pm2 start app 時,只要 ssh key 沒問題, pm2 會自動比較 local 跟 remote, 看是否為最新的 commit,若否,會自動下載更新
pm2 start app.js --no-autorestart # 不自動重啟
PM2 Logs
- 輸出 log
pm2 logs - 顯示指定行數 log (指定倒數 200 行)
pm2 logs --lines 200 - 指定輸出程序 log
pm2 logs id - 指定輸出格式 format
pm2 logs --format - 指定輸出格式 json
pm2 logs --json - 清空 log
pm2 flush - 取消 log 可以利用指定 log 路徑為 /dev/null 來取消 log 輸出, log 參數用法請參考 ecosystem 範例
循環 log
如果你看過 log 檔案超肥,幾年的 log 都寫在同一個檔案; 如果你打開 log 資料夾,發現裡面躺著幾百個 log 檔案; 如果你看過千奇百怪的 log 檔名; 如果你 du -h 發現 log 資料夾大的嚇死人 如果你有以上的經驗,那恭喜你,你有救了
安裝
pm2 install pm2-logrotate
config 檔位置
/home/user/.pm2/module_conf.json
參數
- max_size (預設 10M): 當 log 檔案達到多大時, logrotate module 會將它分割成另外一個檔案。 logrotate module 有可能在檢查檔案時,檔案已經超過指定的大小了,所以超過一些些是可能的。 單位可以自行指定, 10G, 10M, 10K
- retain (預設 30 個 log 檔案): 預設最多保存的 log 數量,如果設定為 7 的話,將會保存目前的 log, 以及最多 7 個 log 檔案
- compress (預設 false): 壓縮所有循環 log 檔案
- dateFormat (時間格式,預設 YYYY-MM-DD_HH-mm-ss) : 檔案命名的時間格式
- rotateModule (預設 true) : 跟其他 apps 一樣,循環 pm2’s module
- workerInterval (預設 30 秒) : 多久 logrotate 會檢查一次 log 檔案大小
- rotateInterval (預設每天午夜循環, 範例 0 0 * ): 除了設定檔案大小以外,我們也可以設定以時間為單位去循環,格式上採用 node-schedule
- TZ (預設為系統時間): 檔案命名的時間會根據你所設定的時區而改變
圖示
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)