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

执行以下命令:

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

本文转自写个博客骗钱博客51CTO博客,原文链接http://blog.51cto.com/dadonggg/1957680如需转载请自行联系原作者


菜鸟东哥

相关文章
|
Java Linux
使用supervisor纳管java进程,自动重启服务
使用supervisor守护java进程,实现服务智能管理,自动重启。
1287 0
|
4月前
|
监控 应用服务中间件 nginx
Supervisor快速入门 | 使用Supervisor守护Nginx进程
Supervisor快速入门 | 使用Supervisor守护Nginx进程
47 0
|
10月前
|
监控 Ubuntu Unix
Supervisor快速入门 | 使用Supervisor守护Nginx进程
Supervisor快速入门 | 使用Supervisor守护Nginx进程
399 0
|
JavaScript Java Shell
java:使用supervisor优雅的管理SpringBoot进程
java:使用supervisor优雅的管理SpringBoot进程
642 0
|
安全 Unix PHP
使用supervisor管理消费队列等进程
使用supervisor管理消费队列等进程
183 0
|
jenkins 持续交付
jenkins通过supervisor配置守护进程
jenkins通过supervisor配置守护进程
184 0
|
监控 NoSQL Java
Linux之奇怪的知识---supervisor超级守护进程的意义和使用方法
Linux之奇怪的知识---supervisor超级守护进程的意义和使用方法
357 0
Linux之奇怪的知识---supervisor超级守护进程的意义和使用方法
|
Python
Python编程:使用supervisor管理Django-Celery进程
Python编程:使用supervisor管理Django-Celery进程
|
缓存 监控 NoSQL
Python编程:supervisor模块管理进程实例
Python编程:supervisor模块管理进程实例
587 0
Python编程:supervisor模块管理进程实例
|
运维 监控 Unix
运维:Centos8安装supervisor守护Nginx进程笔记
Supervisor是基于Python语言开发的一套的进程管理程序,它可以将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时支持自动重启。
运维:Centos8安装supervisor守护Nginx进程笔记