需求:有一個進程需要每時每刻不斷的跑,但是這個進程又有可能由於各種原因有可能中斷。當進程中斷的時候我需要他能自動重啟,保證服務一直在跑著。基於整個需求,一開始想的是起一個腳本,監聽該服務的埠,一旦發現埠占用被解除,立即重新執行命令。但是後來發現linux已經有了類似的東西,即今日的主角Super ...
需求:有一個進程需要每時每刻不斷的跑,但是這個進程又有可能由於各種原因有可能中斷。當進程中斷的時候我需要他能自動重啟,保證服務一直在跑著。基於整個需求,一開始想的是起一個腳本,監聽該服務的埠,一旦發現埠占用被解除,立即重新執行命令。但是後來發現linux已經有了類似的東西,即今日的主角Supervisor:
安裝(Ubuntu)
sudo apt-get install supervisor
可以進入paython測試是否能import supervisor 來確定是否已經裝好。
配置
安裝好supervisor後就可以編寫配置文件了。配置文件放在/etc/supervisor/conf.d/目錄下,最好一個進程對應一個.conf文件。
配置文件參數說明:
[program: test] command=xxxxxxxx ;如果有多條命令,可以寫入shell腳本再在這裡調用 directory=xxxxx ;執行命令時切換到的目錄 user=xxxx ;執行命令所用的linux用戶身份 autorestart=true ;是否自動重啟 autostart=true ;啟動supervisor時是否自行啟動該程式 redirect_stderr=true ;如果為true則將stderr發送到stdout相應的log文件中去 stdout_logfile=/path/to/logfile ;制定stdout的輸出文件 stdout_logfile_maxbytes=10MB ;限定logfile的大小, 預設為50M stdout_logfile_backups=10 ;保存logfile的最大數目,如果操作這個數目則對最早的logfile進行覆蓋,預設為10 environment=A="1", B="2" ;設置環境變數,這裡可以保存運行程式需要的參數
我要的功能非常簡單,僅做瞭如下配置
[program: server] command=python /home/zxchen/server.py ; autorestart=true ; autostart=true ;
啟動服務
sudo supervisorctl reread #成功提示:server: available
sudo supervisorctl reload #成功提示:Restarted supervisord
sudo supervisorctl start app #如果服務沒有啟動時可以試試這個指令
檢驗
lsof -i:埠號 #查看該埠狀態 kill -9 PID #kill掉這個進程
再次查看埠狀態,發現埠上服務的PID已改變,即成功。