天天看點

supervisor管理守護程序

 在Linux或者unix作業系統中,守護程序(Daemon)是一種運作在背景的特殊程序,它獨立于控制終端并且周期性的執行某種任務或等待處理某些發生的事件。

     由于在linux中,每個系統與使用者進行交流的界面稱為終端,每一個從此終端開始運作的程序都會依附于這個終端,這個終端被稱為這些程序的控制終端,當控制終端被關閉的時候,相應的程序都會自動關閉。但是守護程序卻能突破這種限制,它脫離于終端并且在背景運作,并且它脫離終端的目的是為了避免程序在運作的過程中的資訊在任何終端中顯示并且程序也不會被任何終端所産生的終端資訊所打斷。它從被執行的時候開始運轉,直到整個系統關閉才退出。

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

       Supervisor(http://supervisord.org/)是用Python開發的一個client/server服務,是Linux/Unix系統下的一個程序管理工具,不支援Windows系統。它可以很友善的監聽、啟動、停止、重新開機一個或多個程序。用Supervisor管理的程序,當一個程序意外被殺死,supervisort監聽到程序死後,會自動将它重新拉起,很友善的做到程序自動恢複的功能,不再需要自己寫shell腳本來控制。

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

目前存在三個問題

問題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

  如果報錯可能:

提示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

提示下載下傳錯誤,需meld3>0.6.5

下載下傳 http://dl.fedoraproject.org/pub/epel/7/x86_64/p/python-meld3-0.6.10-1.el7.x86_64.rpm

安裝 rpm -ivh python-meld3-0.6.10-1.el7.x86_64.rpm

  如下提示,安裝完成:

<code>Using /usr/lib64/python2.7/site-packages</code>

<code>Finished processing dependencies </code><code>for</code> <code>supervisor==3.3.1</code>

  

2、 配置Supervisor

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

mkdir /etc/supervisor

echo_supervisord_conf &gt; /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檔案再執行第一條指令。

4、 常用指令

<code>sudo service supervisor stop 停止supervisor服務</code>

<code>sudo service supervisor start 啟動supervisor服務</code>

<code>supervisorctl shutdown #關閉所有任務 </code>

<code>supervisorctl stop|start program_name #啟動或停止服務 </code>

<code>supervisorctl status #檢視所有任務狀态</code>

   

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守護程序完畢

本文轉自寫個部落格騙錢部落格51CTO部落格,原文連結http://blog.51cto.com/dadonggg/1957680如需轉載請自行聯系原作者

菜鳥東哥