1. Superivisor簡介:
Supervisor是一個C/S系統,它允許用戶在類UNIX系統上監控和管理一系列的進程。你可以把一個進程以Daemon的形式用Supervisor來管理。
2. 安裝:
使用pip來安裝Supervisor:
[root@test1 ~]# pip install supervisor
如果CentOS系統中沒用安裝pip,可以通過如下命令安裝pip:
[root@test1 ~]# yum -y install python-pip
3. 配置文件:
Supervisor的配置文件需要手動執行命令來生成,如下:
[root@test1 ~]# echo_supervisord_conf > /etc/supervisord.conf
4. 常用的配置項:
command=/bin/cat ---- 啓動程序時執行的命令; directory=/tmp ---- 執行目錄,若有/home/test/test1.py,將directory設置成/home/test,則command只需設置成python test1.py。否則command必須設置成絕對路徑; process_name=%(program_name)s ---- 進程啓動,使用program name作爲進程名,默認值; autostart=true ---- 隨Supervisor啓動一起啓動; startsecs=1 ---- 延時啓動,默認爲1; startretries=3 ---- 啓動失敗時的重試次數,默認爲3; user=root ---- 以root身份運行程序; priority=999 ---- 優先級。值越高,最後啓動,最先被關閉,默認值999。
5. 命令:
Supervisor有兩個可執行程序 :supervisord 和 supervisorctl。
supervisord用來依據配置文件的策略管理後臺守護進程;
supervisorctl管理員用於向後臺守護進程發送“啓動/重啓/停止”等指令。
6. 一個例子,使用Supervisor管理一個Python Flask程序hello.py:
[program:flasky] directory=/opt/flasky/ command=/opt/flasky/venv/bin/python hello.py runserver --host 192.168.1.101 -p 8080 autostart=true startsecs=10 startretries=2 user=root stderr_logfile=/tmp/flasky-error.log stdout_logfile=/tmp/flasky-error.log
7. 啓動Supervisord:
[root@test1 ~]# /usr/bin/supervisord -c /etc/supervisord.conf
8. 查看進程狀態:
[root@test1 ~]# /usr/bin/supervisorctl status flasky STARTING [root@test1 ~]# /usr/bin/supervisorctl status flasky RUNNING pid 46778, uptime 0:00:10 [root@test1 ~]# /usr/bin/supervisorctl status flasky RUNNING pid 46778, uptime 0:00:13
9. Supervisorctl管理命令:
supervisorctl status ---- 查看supervisor管理進程的狀態; supervisorctl stop programname ---- 用來關閉某個進程,programname指上例中的flasky; supervisorctl start programname ---- 用來啓動某個進程; supervisorctl restart programname ---- 用來重啓某個進程; supervisorctl stop all ---- 關閉所有的進程; supervisorctl reload ---- 停止所有進程,載入最新的配置文件,並根據最新的配置啓動、管理進程; supervisorctl update ---- 根據最新的配置文件,啓動新配置的進程或重啓配置有變化的進程,沒有改動過的進程不會受到影響; supervisorctl shutdown ---- 關閉supervisor服務。
曾經有一次面試,面試官提問:“有一個腳本,如何讓它在開機之後一小時的時候開始執行?”
我答:“在腳本開頭加上‘sleep 3600’,再把腳本加入rc.d目錄開機啓動。”
其實,用Supervisor就可以更合理地實現。