Linux Supervisor的安裝與使用入門

ido發表於2018-04-08

       在linux或者unix作業系統中,守護程式(Daemon)是一種執行在後臺的特殊程式,它獨立於控制終端並且週期性的執行某種任務或等待處理某些發生的事件。由於在linux中,每個系統與使用者進行交流的介面稱為終端,每一個從此終端開始執行的程式都會依附於這個終端,這個終端被稱為這些程式的控制終端,當控制終端被關閉的時候,相應的程式都會自動關閉。但是守護程式卻能突破這種限制,它脫離於終端並且在後臺執行,並且它脫離終端的目的是為了避免程式在執行的過程中的資訊在任何終端中顯示並且程式也不會被任何終端所產生的終端資訊所打斷。它從被執行的時候開始運轉,直到整個系統關閉才退出。

此處的建立守護程式,是指釋出在Linux上 asp.net core 程式的dotnet xxx.dll命令的宿主程式建立一個守護程式。

在 Linux 上有很多可以管理程式的工具,我們使用 Supervisor 來做這個事情。原因有兩點:

1、它是微軟官方文件推薦的,降低學習成本。

2、它並不一定是最好的,但一定是文件最全的。

        Supervisor是採用 Python(2.4+) 開發的,它是一個允許使用者管理 基於 Unix 系統程式的 Client/Server 系統,提供了大量功能來實現對程式的管理。

官方文件:http://supervisord.org/

 

目前存在三個問題

問題1:ASP.NET Core應用程式執行在shell之中,如果關閉shell則會發現ASP.NET Core應用被關閉,從而導致應用無法訪問,這種情況當然是我們不想遇到的,而且生產環境對這種情況是零容忍的。 

問題2:如果ASP.NET Core程式意外終止那麼需要人為連進shell進行再次啟動,往往這種操作都不夠及時。 

問題3:如果伺服器當機或需要重啟我們則還是需要連入shell進行啟動。

 

為了解決這個問題,我們需要有一個程式來監聽ASP.NET Core 應用程式的狀況。在應用程式停止執行的時候立即重新啟動。

 

操作如下:

1、  安裝Supervisor

執行以下命令:

yum install python-setuptools
easy_install supervisor

或者

複製程式碼
如果easy_install不好使就從官方下載:
wget https://pypi.python.org/packages/80/37/964c0d53cbd328796b1aeb7abea4c0f7b0e8c7197ea9b0b9967b7d004def/supervisor-3.3.1.tar.gz
然後通過python安裝:
tar zxf supervisor-3.3.1.tar.gz
cd supervisor
python setup.py install
複製程式碼

  如果報錯可能:

  1. 提示setuptools-0.6c11.tar沒有安裝
    下載https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
    tar zxf setuptools-0.6c11.tar.gz
    cd setuptools-0.6c11/
    python setup.py build
    python setup.py  install
  2. 提示下載錯誤,需meld3>0.6.5
    1. 下載 http://dl.fedoraproject.org/pub/epel/7/x86_64/p/python-meld3-0.6.10-1.el7.x86_64.rpm(或者我備份了一份)
    2. 安裝 rpm -ivh python-meld3-0.6.10-1.el7.x86_64.rpm

  如下提示,安裝完成:

1
2
Using /usr/lib64/python2.7/site-packages
Finished processing dependencies for supervisor==3.3.1

   

2、 配置Supervisor

a.建立資料夾和配置檔案

mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf

b.修改/etc/supervisor/supervisord.conf檔案內容

在檔案結尾[include]節點處

把;files = relative/directory/*.ini

改為files = conf.d/*.conf

c.執行supervisorctl reload命令使配置檔案生效。

d.在/etc/supervisor/下建立conf.d資料夾,及ProjectName.conf(以專案名稱命名的)

e.開啟ProjectName.conf檔案,新增內容如下:

複製程式碼
[program: ProjectName]
command=dotnet ProjectName.dll ; 執行程式的命令
directory=/root/Publishing/PublishOutput/ ; 命令執行的目錄
autorestart=true ; 程式意外退出是否自動重啟
autostart=true ; 是否自動啟動
stderr_logfile=/var/log/ProjectName.err.log ; 錯誤日誌檔案
stdout_logfile=/var/log/ProjectName.out.log ; 輸出日誌檔案
environment=ASPNETCORE_ENVIRONMENT=Production ; 程式環境變數
user=root ; 程式執行的使用者身份
stopsignal=INT
startsecs=1 ; 自動重啟間隔 
複製程式碼

儲存並退出

 

3、 執行supervisord,檢視是否生效,執行以下命令:

supervisord -c /etc/supervisor/ supervisord.conf
ps -ef | grep ProjectName

返回

root     27007 27006  1 13:21 ?        00:00:02 dotnet ProjectName.dll 
root     27026 26810  0 13:23 pts/0    00:00:00 grep --color=auto ProjectName

 

表示執行成功!

瀏覽器訪問站點…

 

注意:在執行第一條命令出現以下提示資訊時:

Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  
Shut this program down first before starting supervisord.
For help, use /usr/bin/supervisord –h

是因為有一個使用supervisor配置的應用程式正在執行,需要執行supervisorctl shutdown命令終止它,或重新建立一個ProjectName.conf檔案再執行第一條命令。

 

如果執行supervisorctl出現以下錯誤

error: <class 'socket.error'>, [Errno 111] Connection refused: file: /usr/lib64/python2.6/socket.py line: 567

可能是由於supervisord程式停止了,建議重新執行

sudo supervisord -c /etc/supervisor/supervisord.conf
sudo supervisorctl -c /etc/supervisor/supervisord.conf

 

4、 常用命令

1
2
3
4
5
6
7
8
9
sudo service supervisor stop 停止supervisor服務
 
sudo service supervisor start 啟動supervisor服務
 
supervisorctl shutdown #關閉所有任務
 
supervisorctl stop|start program_name #啟動或停止服務
 
supervisorctl status #檢視所有任務狀態

   

5、 配置supervisord開機啟動

a.在指定目錄下建立檔案supervisord.service

vim /usr/lib/systemd/system/supervisord.service

b.輸入以下內容:

複製程式碼
[Unit]
Description=Supervisor daemon 

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s 

[Install]
WantedBy=multi-user.target 
複製程式碼

儲存並退出 

執行以下命令:

systemctl enable supervisord

提示:

Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.

驗證是否為開機啟動:

systemctl is-enabled supervisord

提示:

enabled

表示設定成功!

至此,建立supervisor守護程式完畢。

 

參考:

Supervisor的安裝與使用入門

CentOS 6.4安裝 Python2.7.10

將ASP.NET Core應用程式部署至生產環境中(CentOS7)

相關文章