使用supervisor管理Linux的應用服務
- 2019 年 10 月 7 日
- 筆記
supervisor 是一個Python程式,採用守護進程的方式,對單台機器上的程式進行啟停管理、自動重啟等。如果你想保證的的程式異常推出後能夠自動啟動,supervisor就是你的一個選擇
安裝
pip install supervisor
安裝後會產生兩個可執行程式
- supervisortd:守護進程服務
- supervisorctl:客戶端,用於命令行交互
啟動
建議通過指定配置文件的方式進行啟動
supervisord -c /etc/supervisord/supervisord.conf
主配置文件
[unix_http_server] file=/var/run/supervisor.sock ; (the path to the socket file) chmod=0700 ; sockef file mode (default 0700)[supervisord] logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP) environment=SPAN_STORAGE_TYPE="elasticsearch"[supervisorctl] serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket[include] files = /etc/supervisord/conf.d/*.conf[inet_http_server] port = 127.0.0.1:9001[rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface我們會將啟動管理的程式放在/etc/supervisord/conf.d/*.conf目錄下(可自定義)
environment 可以追加一些啟動環境的環境變數
注意下面的inet_http_server一定要加上,否則,你的客戶端控制程式就需要鏈接socket文件進行啟動,而不是默認的埠。
程式配置實例
上面的配置文件只是為了控制supervioed的行為,為了管理我們的程式,還需要創建一批配置文件。每一個配置文件,對應一個外部程式的管理。
例子:
[root@s17 conf.d]# cat agent.conf [program:agent] command = /root/jaeger-1.5.0-linux-amd64/jaeger-agent --collector.host-port=192.168.3.237:14267 --discovery.min-peers=1 --log-level=debug directory = /root/jaeger-1.5.0-linux-amd64 user = root startsecs = 3redirect_stderr = true stdout_logfile_maxbytes = 50MB stdout_logfile_backups = 10 stdout_logfile = agent.log
注意日誌終端是直接阻塞在supervisor上的,所以不需要使用nohup之類的語句
管理
直接運行supervisorctl即可
[root@s17 conf.d]# supervisorctlagent RUNNING pid 1656, uptime 7 days, 1:28:47collect RUNNING pid 2663, uptime 7 days, 0:35:11doc RUNNING pid 1657, uptime 7 days, 1:28:47query RUNNING pid 2595, uptime 7 days, 1:24:32
可以看到提供了豐富的指令
supervisor> helpdefault commands (type help <topic>): ===================================== add exit open reload restart start tail avail fg pid remove shutdown status update clear maintail quit reread signal stop versionsupervisor>
注意:supervisor的啟動要和應用程式使用相同的用戶和許可權(程式自己控制的除外),否則會產生死鎖問題。遇到這種情況,需要手動kill進程,修正許可權後使用。