supervisor管理守护进程

      在Linux或者unix操做系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端而且周期性的执行某种任务或等待处理某些发生的事件。python

     因为在linux中,每一个系统与用户进行交流的界面称为终端,每个今后终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。可是守护进程却能突破这种限制,它脱离于终端而且在后台运行,而且它脱离终端的目的是为了不进程在运行的过程当中的信息在任何终端中显示而且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。linux

此处的建立守护进程,是指发布在Linux上 asp.NET core 程序的dotnet xxx.dll命令的宿主进程建立一个守护进程。shell


       Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它能够很方便的监听、启动、中止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它从新拉起,很方便的作到进程自动恢复的功能,再也不须要本身写shell脚原本控制。vim

        Supervisor是采用 Python(2.4+) 开发的,它是一个容许用户管理 基于 Unix 系统进程的 Client/Server 系统,提供了大量功能来实现对进程的管理。浏览器


 

目前存在三个问题服务器

问题1:ASP.net Core应用程序运行在shell之中,若是关闭shell则会发现ASP.Net Core应用被关闭,从而致使应用没法访问,这种状况固然是咱们不想遇到的,并且生产环境对这种状况是零容忍的。 python2.7

问题2:若是ASP.NET Core进程意外终止那么须要人为连进shell进行再次启动,每每这种操做都不够及时。 ide

问题3:若是服务器宕机或须要重启咱们则仍是须要连入shell进行启动。工具

 

为了解决这个问题,咱们须要有一个程序来监听ASP.NET Core 应用程序的情况。在应用程序中止运行的时候当即从新启动。ui

 

操做以下:

一、  安装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

  

 

二、 配置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 ; 自动重启间隔

 

保存并退出

 

三、 运行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文件再执行第一条命令

 

四、 经常使用命令

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

相关文章
相关标签/搜索