Python---進程管理工具(Supervisor)

三、修改supervisord.conf文件

# 在supervisord.conf的末尾添加如下代碼:
[program:domain_check]
# [program:程序名]

# command=/bin/bash -c "需要執行的命令,多句命令用分號隔開"
# command=python /root/ihasy/application.py --port=9001 --mysql_database=ihasy --mysql_host=localhost --mysql_password=764895 --mysql_user=root
command=/usr/bin/python /www/wwwroot/domain_check/Main.py
directory=/www/wwwroot/domain_check

numprocs=2                                    # 啓動進程的數目,默認爲1。; 若 numprocs 不爲1時,就是進程池的概念。process_name 的表達式中一定要包含 process_num 來區分不同的進程
process_name=%(program_name)s_%(process_num)02d

autostart=true                                # 該程序是否跟隨supervisor一起啓動,默認是true。如果是true的話,子進程將在supervisord啓動後被自動啓動。
autorestart=true                              # 如果該程序掛了,是否重新啓動(異常退出時,自動啓動,可選值:[unexpected,true,false],默認爲unexpected,表示進程意外殺死後才重啓)
startsecs=6                                   # 啓動後持續6秒後未發生異常,才表示啓動成功。啓動6秒後沒有異常退出,就表示進程正常啓動了,默認爲1秒
startretries=3                                # 異常後,自動重啓次數。啓動失敗自動重試次數,默認是3。當超過3次後,supervisor將把此進程的狀態置爲FATAL 

user=root                                     # 設置啓動該程序的用戶,默認是root
priority=999                                  # 進程啓動優先級(值越小越優先啓動)。權重值,值越低,越早啓動,越晚關閉。默認999                  

stdout_logfile=/var/www/ProjectName.out.log   # 終端標準輸出重定向文件
stdout_logfile_maxbytes=2MB                   # 文件最大大小
stdout_logfile_backups=30                     # 文件備份最大數量
stdout_capture_maxbytes=2MB
stderr_logfile=/var/www/ProjectName.err.log   # 終端錯誤輸出重定向文件
stderr_logfile_maxbytes=2MB                   # 文件最大大小
stderr_logfile_backups=30                     # 文件備份最大數量
stderr_capture_maxbytes=2MB
redirect_stderr=true                          # 如果爲true,則stderr的日誌會被寫入stdout日誌文件中

stopasgroup=false                             # 默認爲false,進程被殺死時,是否向這個進程組發送stop信號,包括子進程
killasgroup=false                             # 默認爲false,向進程組發送kill信號,包括子進程
environment=PATH="/home/app_env/bin"          # 可以通過 environment 來添加需要的環境變量,一種常見的用法是使用指定的 virtualenv 環境 

# startsecs=6:即6秒內程序即沒有出現異常,也沒有執行完,執行完也是異常退出,會自動重啓。
# process_name=%(program_name)s_%(process_num)02d:這個是進程名,如果我們下面的numprocs參數爲1的話,就不用管這個參數了,它默認值%(program_name)s也就是上面的那個program冒號後面的名字,但是如果numprocs爲多個的話,那就不能這麼幹了。想想也知道,不可能每個進程都用同一個進程名吧。
# 參考:https://www.cnblogs.com/zhaoding/p/6257363.html
# 參考:https://blog.51cto.com/lixcto/1539136
[unix_http_server]     
# socket文件的路徑,supervisorctl用XML_RPC和supervisord通信就是通過它進行的。如果不設置的話,supervisorctl也就不能用了。不設置的話,默認爲none。非必須設置       
file=/tmp/supervisor.sock 
# 這個就是修改上面的那個socket文件的權限爲0700。不設置的話,默認爲0700。 非必須設置                                    
chmod=0700    
# 這個就是修改上面的那個socket文件的屬組爲user.group。不設置的話,默認爲啓動supervisord進程的用戶及屬組。非必須設置             
chown=nobody:nogroup       
# 使用supervisorctl連接的時候,認證的用戶。不設置的話,默認爲不需要用戶。 非必須設置   
username=user              
# 和上面的用戶名對應的密碼,可以直接使用明碼,也可以使用SHA加密。如:{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d。默認不設置。非必須設置                               
password=123


# 偵聽在TCP上的socket,Web Server和遠程的supervisorctl都要用到它。不設置的話,默認爲不開啓。非必須設置
[inet_http_server]         
# 這個是偵聽的IP和端口,偵聽所有IP用 :9001或*:9001。只要上面的[inet_http_server]開啓了,就必須設置它。 
port=127.0.0.1:9001         
# 這個和上面的uinx_http_server一個樣。非必須設置
username=user               
# 這個也一個樣。非必須設置
password=123    


# 這個主要是定義supervisord這個服務端進程的一些參數的。這個必須設置,不設置,supervisor就不用幹活了
[supervisord]                
# 這個是supervisord這個主進程的日誌路徑,注意和子進程的日誌不搭嘎。默認路徑$CWD/supervisord.log,$CWD是當前目錄。非必須設置
logfile=/tmp/supervisord.log 
# 這個是上面那個日誌文件的最大的大小,當超過50M的時候,會生成一個新的日誌文件。當設置爲0時,表示不限制文件大小。默認值是50M,非必須設置。              
logfile_maxbytes=50MB        
# 日誌文件保持的數量,上面的日誌文件大於50M時,就會生成一個新文件。文件數量大於10時,最初的老文件被新文件覆蓋,文件數量將保持爲10。當設置爲0時,表示不限制文件的數量。默認情況下爲10。非必須設置
logfile_backups=10
# 日誌級別,有critical, error, warn, info, debug, trace, or blather等。默認爲info。非必須設置項           
loglevel=info                
# supervisord的pid文件路徑。默認爲$CWD/supervisord.pid。非必須設置  
pidfile=/tmp/supervisord.pid 


[supervisorctl]
# 這個是supervisorctl本地連接supervisord的時候,本地的UNIX socket路徑,注意這個和前面的[unix_http_server]對應。默認值就是unix:///tmp/supervisor.sock。非必須設置
serverurl=unix:///tmp/supervisor.sock
# 這個是supervisorctl遠程連接supervisord的時候,用到的TCP socket 路徑,注意這個和前面的[inet_http_server]對應。默認值就是http://127.0.0.1:9001。非必須項
serverurl=http://127.0.0.1:9001
# 用戶名,默認空。非必須設置
username=chris
# 密碼,默認爲空。非必須設置             
password=123
# 輸入用戶名密碼時候的提示符。默認supervisor。。非必須設置
prompt=mysupervisor
# 這個參數和shell中的history類似,我們可以用上下鍵來查找前面執行過的命令。默認是no file的。所以我們想要有這種功能,必須指定一個文件。非必須設置
history_file=~/.sc_history              


[include]
# 這個東西挺有用的,當我們要管理的進程很多的時候,寫在一個文件裏面就有點大了。我們可以把配置信息寫到多個文件中,然後include過來。
files = /www/server/plugin/supervisor/profile/*.ini

五、supervisor開機啓動 

# 1.編輯rc.local文件
  [root@localhost ~]# vi /etc/rc.local

# 2.修改rc.local文件,在 exit 0 前面加上:
  supervisord -c /etc/supervisor/supervisord.conf

# 3.設置rc.local文件的執行權限
  [root@localhost ~]# chmod 755 /etc/rc.local

# 4.重啓就可以自動運行 supervisor服務了。
# 參考:https://www.cnblogs.com/xiaoyaodijun/p/6286798.html
# 參考:https://www.2cto.com/kf/201712/702837.html

六、Web管理頁面

supervisor提供了可視化的Web管理頁面,允許遠程操作,但是需要在配置文件中手動打開。可以在網頁端訪問supervisor服務。

# 1.打開配置配件
  [root@localhost ~]# vi /etc/supervisor/supervisord.conf

# 2.將下面幾行前面的分號去掉,修改一下數據保存退出(用戶名與密碼自己定義)
  [inet_http_server]            # inet (TCP) server disabled by default
  port=160.250.98.256:9001      # ip_address:port specifier, *:port for all iface
  username=user                 # default is no username (open server)
  password=123                  # default is no password (open server)

# 3.重新載入配置文件
  [root@localhost ~]# supervisorctl reload

# 4.在瀏覽器輸入:160.250.98.256:9001,再輸入用戶名與密碼即可登陸查看。

七、基本常用命令

# 啓動supervisor服務
sudo service supervisor start
# 停止supervisor服務
sudo service supervisor stop
# 2.supervisorctl 命令介紹:program_name 爲 [program:x] 裏的 x
# 停止某個進程
supervisorctl stop program_name
# 啓動某個進程
supervisorctl start program_name
# 重啓某個進程
supervisorctl restart program_name
# 停止|啓動|重啓 全部進程,注:start、restart、stop 都不會載入最新的配置文件
supervisorctl stop|start|restart all

# 結束所有屬於名爲 groupworker 這個分組的進程 (start,restart 同理)
supervisorctl stop groupworker:
# 結束 groupworker:name1 這個進程 (start,restart 同理)
supervisorctl stop groupworker:name1

# 查看所有任務狀態
supervisorctl status 
# 查看單個任務狀態
supervisorctl status program_name(服務名)
# 關閉所有任務
supervisorctl shutdown 
# 載入最新的配置文件,停止原有進程並按新的配置啓動、管理所有進程
supervisorctl reload
# 根據最新的配置文件,啓動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啓
supervisorctl update

# 查看運行狀態並進入控制檯,在控制檯中執行命令可以省去supervisorctl命令。
# 即先輸入: supervisorctl,後面再輸入命令的時候就不用加上supervisorctl了。例如:stop httpserver

八、supervisord 進程狀態

STOPPED (0)     該進程已停止。
STARTING (10)   該進程由於啓動請求而開始。
RUNNING (20)    該進程正在運行。
BACKOFF (30)    該過程進入“ 啓動”狀態,但隨後退出的速度太快而無法移至“ 運行”狀態。 前面有startsecs 這個參數設定。
STOPPING (40)   由於停止請求,該進程正在停止。
EXITED (100)    該進程從RUNNING狀態退出(預期或意外)。
FATAL (200)     該過程無法成功啓動。
UNKNOWN (1000)  該進程處於未知狀態(supervisord 編程錯誤)。

九、查看守護進程 

# 1.查看守護進程
  [root@localhost ~]# ps -axj
  # -a 顯示由其他用戶所擁有的進程的狀態
  # -x 顯示沒有控制終端的進程狀態
  # -j 顯示與作業有關的信息:會話ID、進程組ID等

# 2.守護進程與用&結尾的後臺運行程序有什麼區別?
  (a)守護進程已經完全脫離終端控制檯了,而後臺程序並未完全脫離終端,在終端未關閉前還是會往終端輸出結果。
  (b)守護進程在關閉終端控制檯時不會受影響,而後臺程序會隨用戶退出而停止,需要在以nohup command & 格式運行才能避免影響。
  (c)守護進程的會話組和當前目錄,文件描述符都是獨立的。後臺運行只是終端進行了一次fork,讓程序在後臺執行,這些都沒改變。

# 3.如何使普通進程達到守護進程的部分效果?
  [root@localhost ~]# nohup ./a.out &
  # nohup忽略SIGHUP信號,&忽略SIGINT信號。

# 4.守護進行的一些特點:
  1.守護進程基本上都是以超級用戶啓動( UID 爲 0 )
  2.沒有控制終端( TTY 爲 ?)
  3.終端進程組 ID 爲 -1 ( TPGID 表示終端進程組 ID)

# 5.守護進程可以通過以下方式啓動:
  1.在系統啓動時由啓動腳本啓動,這些啓動腳本通常放在 /etc/rc.d 目錄下;
  2.利用 inetd 超級服務器啓動,如 telnet 等;
  3.由 cron 定時啓動以及在終端用 nohup 啓動的進程也是守護進程。

# 6.在前臺執行而不是守護進程來執行是啥意思?
  前臺執行是可見的,會佔用當前termal窗口,使窗口不能再執行別的命令和任務,可以用control+c中斷;
  守護進程就是可以在後臺運行,由守護進程保證任務的不間斷,當系統檢測到守護進程中進程終止之後會自動再拉起這個進程或者任務。
  比如mysql的守護進程名字是mysqld,防火牆firwall的進程是firewalld,守護進程一般默認以進程+d結尾;也有一個軟件叫做supervisor,可以用來進行進程守護。

# 7.公司有一個app後臺管理程序需要部署,該程序是用go語言編寫的二進制文件,後臺需要持續運行這個二進制文件,保證服務的持續運行。
  方案1:直接採用 nohup ./app_admin &後臺運行方式,該方式存在一個缺點,如果服務器重啓後,或者程序運行出錯的話,服務就會終止,這種方式不穩定。
  方案2:採用supervisor進程管理方式守護go語言的二進制文件運行,保證程序的持續運行。

# 8.Supervisor注意的地方
  Supervisor只能管理非daemon的進程,也就是說Supervisor不能管理守護進程。否則提示Exited too quickly (process log may have details)異常。
  command=/home/ubuntu/webvideo/nginx/sbin/nginx -g 'daemon off;'
  Nginx 使用nginx -g ‘daemon off;’ 命令將nginx運行在前臺,因爲supervisord 無法監控後臺進程。

# 9.運行Supervisor需要root權限。supervisorctl命令需要root權限。

十、常見報錯

1.啓動supervisor服務報錯:Error: Another program is already listening on a port that one of our HTTP servers is configured touse.  Shut this program down first before starting supervisord.
  1.[root@localhost supervisor]# ps -ef | grep supervisord
  2.[root@localhost supervisor]# kill -9 5510
  # 重啓啓動supervisor服務
  3.[root@localhost supervisor]# supervisord -c /etc/supervisor/supervisord.conf

九、參考

比較詳細:https://www.cnblogs.com/sundahua/p/9149579.html

http://outofmemory.cn/code-snippet/884/python-write-shouhu-process-code-shili

https://www.jb51.net/article/142427.htm

https://www.cnblogs.com/gsblog/p/3730293.html

https://www.cnblogs.com/mickole/p/3188321.html

https://www.jianshu.com/p/3658c963d28b

https://www.jianshu.com/p/03619bf7d7f5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章