Linux Supervisor的安裝與使用入門
在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
如果報錯可能:
- 提示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
如下提示,安裝完成:
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守護進程完畢。
轉自:http://www.cnblogs.com/Hai--D/p/5820718.html
Linux Supervisor的安裝與使用入門