系统:CentOS 7 防火墙状态:关闭
一:基础知识
1、什么是守护进程
在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。
由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终
端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程
中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。
本篇的创建守护进程,是指发布在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主进程创建一个守护进程。
在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。原因有两点:
- 1、它是微软官方文档推荐的,降低学习成本。
- 2、它并不一定是最好的,但一定是文档最全的。
2、认识 Supervisor
2.1 Supervisor 介绍
Supervisor是一个客户端/服务器系统,采用 Python(2.4+) 开发的,它是一个允许用户管理,基于 Unix 系统进程的 Client/Server 系统,提供了大量功能来实现对进程的管理。
2.2 Supervisor 特征
- 简单
- Supervisor通过简单的INI样式(可以修改为.conf后缀)配置文件进行配置,该文件易于学习。它提供了许多每个进程选项,使您的生活更轻松,如重新启动失败的进程和自动日志轮换。
- 集中
- 主管为您提供一个启动,停止和监控流程的位置。流程可以单独控制,也可以成组控制。您可以将Supervisor配置为提供本地或远程命令行和Web界面。
- 高效
- 主管通过fork / exec启动其子进程,子进程不进行守护。当进程终止时,操作系统会立即向Supervisor发出信号,这与某些依赖麻烦的PID文件和定期轮询重新启动失败进程的解决方案不同。
- 扩展
- Supervisor有一个简单的事件通知协议,用任何语言编写的程序都可以用它来监视它,以及一个用于控制的XML-RPC接口。它还使用可由Python开发人员利用的扩展点构建。
- 兼容
- 除了Windows之外,Supervisor几乎可以处理所有事情。它在Linux,Mac OS X,Solaris和FreeBSD上经过测试和支持。它完全用Python编写,因此安装不需要C编译器。
- 久经考验
- 虽然Supervisor今天非常活跃,但它并不是新软件。主管已存在多年,已在许多服务器上使用。
2.3 两个重要文件
supervisord
负责管理进程的server端,配置文件是/etc/supervisor/supervisord.conf
supervisorctl
client端的命令行工具,管理子进程,配置文件在/etc/supervisor/supervisord.d/目录下
3、废话少说直接安装 Supervisor
1.先安装supervisor
yum install -y supervisor
(如果用的是阿里云的CentOS7会提示找不到supervisor,则yum install epel-release先安装EPEL源)
2. 设置开机启动
systemctl enable supervisord
3.启动supervisord
systemctl start supervisord
4.查看状态
systemctl status supervisord
5.修改配置文件,设置web访问
vim /etc/supervisord.conf
如下图把[inet_http_server]模块的注释去掉并修改IP、用户名与密码
把 [inet_http_server] 改成
port=192.168.1.108:9001 即 ip:9001(或者0.0.0.0:9001)
username=root
password=123456
6.重启配置文件
supervisorctl reload
PS:如果防火墙开启状态,添加9001端口到防火墙
firewall-cmd --zone=public --add-port=9001/tcp --permanent firewall-cmd --reload
7. 安装完成,访问supervisor
到此。supervisor安装完成。
8. 将.net core 项目添加到Supervisor
1) 查看supervisor配置文件
cat /etc/supervisord.conf
配置需要管理的进程,就是在目录 /etc/supervisord.d/下面 添加 .ini的文件。
也可修改为files = supervisord.d/*.conf后缀 ,这样就是添加 .conf的文件。其他没区别。
2)添加需要管理进程的文件
$ cd /etc/supervisord.d/ $ vim YFTimeProjectConf.conf
将下面这段话贴进去:
[program: YFTimeProject] command=dotnet YiSha.Admin.Web.dll ; 运行程序的命令 directory=/root/DotNetCoreArea/YFTimewebpublish/ ; 命令执行的目录 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 ; 自动重启间隔
PS:program: 访问supervisor主页时,显示在name这一列的 信息,就是当前进程保护的程序在页面呈现的名字。
command: 就是dotnet命令,启动项目。
directory:项目的绝对你路径
访问supervisor 站点网址,即可看到:
running就表示添加当前项目到了守护进程成功。
3)报错处理
(1)使用Supervisor 为服务创建守护进程失败
1 2 3 |
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文件再执行第一条命令。
(2)如果运行supervisorctl出现以下错误
1 |
error: <class 'socket.error' >, [Errno 111] Connection refused: file : /usr/lib64/python2 .6 /socket .py line: 567
|
说明Supervisor 服务没有启动成功,或Supervisor 服务被关闭了,重启启动服务即可。
4)常用命令
supervisorctl:
$
sudo
service supervisor stop 停止supervisor服务
$
sudo
service supervisor start 启动supervisor服务
$ supervisorctl
shutdown
#关闭所有任务
$ supervisorctl stop|start program_name
#启动或停止服务
$ supervisorctl status
#查看所有任务状态
supervisord:(可以不带后面的.service)
systemctl start supervisord.service 开启服务 systemctl enable supervisord.service 开机自启 systemctl status supervisord.service 查询服务状态
借鉴:
https://www.cnblogs.com/yjlch1016/p/10162918.html
https://www.cnblogs.com/along21/p/10255681.html