在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

执行以下命令:

  1. yum install python-setuptools

  2. easy_install supervisor

或者

  1. 如果easy_install不好使就从官方下载:wget https://pypi.python.org/packages/80/37/964c0d53cbd328796b1aeb7abea4c0f7b0e8c7197ea9b0b9967b7d004def/supervisor-3.3.1.tar.gz

  2. 然后通过python安装:

  3. # tar zxf supervisor-3.3.1.tar.gz

  4. # cd supervisor

  5. # python setup.py install

  如果报错可能:

  1. 提示setuptools-0.6c11.tar没有安装,

    1. 下载https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz

    2. tar zxf setuptools-0.6c11.tar.gz

    3. cd setuptools-0.6c11/

    4. python setup.py build

    5. 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文件再执行第一条命令

 

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守护进程完毕