在linux或者unix操做系統中,守護進程(Daemon)是一種運行在後臺的特殊進程,它獨立於控制終端而且週期性的執行某種任務或等待處理某些發生的事件。因爲在linux中,每一個系統與用戶進行交流的界面稱爲終端,每個今後終端開始運行的進程都會依附於這個終端,這個終端被稱爲這些進程的控制終端,當控制終端被關閉的時候,相應的進程都會自動關閉。可是守護進程卻能突破這種限制,它脫離於終端而且在後臺運行,而且它脫離終端的目的是爲了不進程在運行的過程當中的信息在任何終端中顯示而且進程也不會被任何終端所產生的終端信息所打斷。它從被執行的時候開始運轉,直到整個系統關閉才退出。html
此處的建立守護進程,是指發佈在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主進程建立一個守護進程。python
在 Linux 上有不少能夠管理進程的工具,咱們使用 Supervisor 來作這個事情。緣由有兩點:linux
一、它是微軟官方文檔推薦的,下降學習成本。shell
二、它並不必定是最好的,但必定是文檔最全的。vim
Supervisor是採用 Python(2.4+) 開發的,它是一個容許用戶管理 基於 Unix 系統進程的 Client/Server 系統,提供了大量功能來實現對進程的管理。瀏覽器
官方文檔:http://supervisord.org/服務器
官方文檔:http://supervisord.org/configuration.html --config配置asp.net
目前存在三個問題python2.7
問題1:ASP.NET Core應用程序運行在shell之中,若是關閉shell則會發現ASP.NET Core應用被關閉,從而致使應用沒法訪問,這種狀況固然是咱們不想遇到的,並且生產環境對這種狀況是零容忍的。 socket
問題2:若是ASP.NET Core進程意外終止那麼須要人爲連進shell進行再次啓動,每每這種操做都不夠及時。
問題3:若是服務器宕機或須要重啓咱們則仍是須要連入shell進行啓動。
爲了解決這個問題,咱們須要有一個程序來監聽ASP.NET Core 應用程序的情況。在應用程序中止運行的時候當即從新啓動。
建議使用 root 管理員帳戶操做
操做以下:
一、 安裝Supervisor到SuSE系統
執行如下命令:
安裝python
sudo zypper in python-pip
sudo pip install -U setuptools
pip 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
|
二、 配置Supervisor
a.建立文件夾和配置文件
mkdir /etc/supervisor echo_supervisord_conf > /etc/supervisor/supervisord.conf
b.修改/etc/supervisor/supervisord.conf文件內容
在文件結尾[include]節點處
把;files = relative/directory/*.ini
改成files = /etc/supervisor/conf.d/*.conf
[include]
files = /etc/supervisor/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 ; #自動重啓間隔
注:保存時把#後面的漢語註釋去掉
保存並退出
三、 運行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
四、 經常使用命令
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 #查看全部任務狀態
|
五、 配置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守護進程完畢。
原文連接:https://www.cnblogs.com/Hai--D/p/5820718.html
若是上述操做步驟有問題的話,
例如:
No such file or directory: file: /usr/lib64/python2.7/socket.py line: 228
或者 socket error等等
能夠參考下面文件操做:
一、結構:etc下有文件夾 supervisor,文件夾supervisor下面包含兩個,一個是conf.d文件夾和supervisord.conf文件
二、supervisord.conf文件具體內容
; Sample supervisor config file.
;
; For more information on the config file, please see:
; http://supervisord.org/configuration.html
[unix_http_server]
file=/var/run/supervisor.sock ; the path to the socket file
chmod=0700 ; socket file mode (default 0700)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10 ; # of main logfile backups; 0 means none, default 10
loglevel=info ; log level; default info; others: debug,warn,trace
pidfile=/var/run/supervisord.pid ; supervisord pidfile; default supervisord.pid
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
; The supervisorctl section configures how supervisorctl will connect to
; supervisord. configure it match the settings in either the unix_http_server
; or inet_http_server section.
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = /etc/supervisor/conf.d/*.conf
注意:若是文件中是 /tmp 的所有換換成/var/run或者/var/log
三、conf.d文件夾下是自定義的文件 如MmPScore.conf
具體內容以下:
[program:MmPS]
command=dotnet MmPS.dll
directory=/home/linjie/桌面/SUSE Linux Enterprise Server 12 SP2 64 位
environment=ASPNETCORE__ENVIRONMENT=Production
stopsignal=INT
autostart=true
autorestart=true
startsecs=1
stderr_logfile=/var/log/MmPS.err.log
stdout_logfile=/var/log/MmPS.out.log
四、若是所有操做完後之後,文件及內容與上述的一致,仍是有問題的話,
執行:
sudo supervisord -c /etc/supervisor/supervisord.conf
sudo supervisorctl -c /etc/supervisor/supervisord.conf
基本都會解決的。