Supervisor – 監控您的 Linux 服務器和進程

一些用戶只需要控制進程狀態,而不想要或不需要對運行進程的機器進行全面的 shell 訪問。 他們通常不需要知道偵聽“低”TCP 端口的進程,並且通常需要以 root 用戶身份啟動和重新啟動。 有些進程通常需要成組啟動和停止,有時需要考慮優先級順序。 工具名稱主管可幫助用戶管理您服務器上的進程並監控每個進程或一組進程。

什麼是主管?

Supervisor 是一個客戶端/服務器系統,允許其用戶控制 Linux 和類 UNIX 操作系統上的許多進程。 進程可以分組為“進程組”,一組邏輯相關的進程可以作為一個單元停止和啟動。 它通過 fork/exec 啟動它的子進程,並且子進程不會守護進程。 當進程終止時,操作系統立即向主管發送信號。

Supervisor基於四個組成部分:

  • 主管: 服務器部分負責在自己的調用中啟動子程序,響應來自客戶端的命令,重新啟動崩潰或退出的子進程。
  • 監督者: 它是命令行客戶端,它為 supervisord 提供的功能提供了一個類似 shell 的界面。 用戶可以連接到不同的 supervisord 進程,獲取受控制的子進程的狀態,停止和啟動其子進程,並獲取正在運行的進程列表
  • 網絡服務器: 它是一個(稀疏的)Web 用戶界面,其功能與 supervisorctl 相當,如果您針對 Internet 套接字啟動 supervisord,則可以通過瀏覽器訪問
  • XML-RPC 接口: 為 Web UI 提供服務的 HTTP 服務器提供了一個 XML-RPC 接口,可用於詢問和控制主管及其運行的程序

supervisor 工具允許您為進程分配優先級,並允許用戶通過 supervisorctl 客戶端發出命令,如“全部啟動”和“重新啟動全部”,它們以預先分配的優先級順序啟動它們。 它完全用 Python 編寫,實際使用的版本是 3.2.1。 主管不適用於 Python 3

1) 安裝主管

Supervisor 提供了安裝的可能性,但我將通過分發包向您展示安裝。

在centos 7

# yum install epel-release -y && yum update
# yum install supervisor
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.linode.com
 * epel: fedora-epel.mirrors.tds.net
 * extras: mirrors.linode.com
 * updates: mirrors.linode.com
Resolving Dependencies
--> Running transaction check
---> Package supervisor.noarch 0:3.1.4-1.el7 will be installed
--> Processing Dependency: python-meld3 >= 0.6.5 for package: supervisor-3.1.4-1.el7.noarch
--> Processing Dependency: python-setuptools for package: supervisor-3.1.4-1.el7.noarch

在 Ubuntu 16.04 上

# apt update && apt upgrade
# apt install supervisor
Reading package lists... Done
Building dependency tree 
Reading state information... Done
The following additional packages will be installed:
 python-meld3 python-pkg-resources
Suggested packages:
 python-setuptools supervisor-doc
The following NEW packages will be installed:
 python-meld3 python-pkg-resources supervisor
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 392 kB of archives.

2)從監控工具supervisor入手

主管配置文件是 /etc/supervisord.conf. 它用於 supervisord 和 supervisorctl 命令。

a) 配置主管 web 服務器

主管配置文件包含兩個名為的部分 [unix_http_server][inet_http_server] 在它下面我們有一個 HTTP 服務器的配置參數,它在 UNIX 域上偵聽,並且應該插入 TCP(互聯網)套接字。 您的部分應如下所示

# vim /etc/supervisor.conf

[unix_http_server]

文件=/var/run/supervisor/supervisor.sock ; (套接字文件的路徑) ;chmod=0700 ; sockef 文件模式 (默認 0700) ;chown=nobody:nogroup ; 套接字文件 uid:gid owner ;username=user ; (默認為無用戶名(開放服務器));password=123; (默認為無密碼(開放服務器))

[inet_http_server] ; 默認情況下禁用 inet (TCP) 服務器 port=server-ip-address:9001 ; (ip_address:port 說明符, *:port for all iface) username=user ; (默認為無用戶名(開放服務器)) password=123 ; (默認為無密碼(開放服務器))

b) 添加監控程序

在 supervisord 執行任何操作之前,您至少需要添加一個 程序 部分到其配置,以便您能夠監視程序本身。 這 程序 部分將定義一個在您調用 supervisord 命令時運行和管理的程序。 所以,要添加一個程序,我們將編輯配置文件並添加到最後,例如 example,命令如下:

# vim /etc/supervisord.conf

[program:cat-command]

命令=/bin/cat ; 程序(相對使用PATH,可以帶參數) process_name=%(program_name)s ; process_name expr (默認 %(program_name)s) numprocs=1 ; 要啟動的進程副本數(定義 1)

[program:apache2]

command=/usr/sbin/httpd -c “ErrorLog /dev/stdout” -DFOREGROUND redirect_stderr=true

c) 開始監督

要啟動 supervisord,我們將運行 supervisord 命令。 第一次,您可以使用 -n 在前台啟動它的選項,這對於調試啟動問題和 -c 標誌來指示配置文件的完整路徑。 由此產生的進程將自我守護並與終端分離。 它將操作日誌保存在 /var/log/supervisor/supervisord.log 默認情況下。 如果你不使用 -c, supervisord 會先搜索當前文件夾下的配置

# supervisord -c /etc/supervisord.conf

現在我們可以檢查主管日誌文件

# tail -f /var/log/supervisor/supervisord.log 
2017-09-07 08:30:53,725 INFO daemonizing the supervisord process
2017-09-07 08:30:53,726 INFO supervisord started with pid 789
2017-09-07 08:30:54,729 INFO spawned: 'cat-command' with pid 790
2017-09-07 08:30:54,731 INFO spawned: 'apache2' with pid 791
2017-09-07 08:30:55,805 INFO success: cat-command entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-09-07 08:30:55,807 INFO spawned: 'apache2' with pid 794

我們可以看到它開始了。 如果您使用 -n 選項,主管將在前台啟動,您需要在後台發送它以控制您的終端

3) 與主管一起監控您的流程

我們可以使用 Web 界面與主管一起管理流程,或者我們可以使用supervisorctl 命令行。 我們已經配置了兩個進程,但是一個進程運行不好,所以我們來看看supervisor如何檢查我們的進程

a) 使用 supervisorctl 監控進程

supervisorctl 使用一些基本命令來管理您的進程:停止、啟動、狀態、重新啟動、重新加載、尾部等。要管理您的進程,請使用 supervisorctl 命令

# supervisorctl status
apache2 FATAL Exited too quickly (process log may have details)
cat-command RUNNING pid 790, uptime 0:02:52

您可以看到 cat 命令運行良好,但 apache 命令不起作用,我們得到了回報。

您可以使用以下命令重新啟動該過程

# supervisorctl restart all
cat-command: stopped
cat-command: started
apache2: ERROR (abnormal termination)

b) 通過網絡界面監控進程

[inet_http_server] 部分是用於訪問 Web 界面的部分。 請記住,它包含的內容應如下所示,但您可以使用其他用戶名和密碼

[inet_http_server] ; inet (TCP) server disabled by default
port=server-ip-address: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))

現在您可以打開您的網絡瀏覽器並使用以下端口輸入您的服務器 IP 地址

您可以看到可以重新啟動、停止或查看日誌。

我們已經看到瞭如何使用 supervisor 監控新進程,這對於不需要控制服務器本身但只需要監控他們需要的進程是否啟動的用戶很有用,這樣他們就可以如果需要,重新啟動它。 添加新進程時,需要使用 supervisorctl 命令的 reread 和 update 命令,以便 supervisor 將其添加到當前進程中。