今天需要再服务上部署一个.net 方面的项目;当时开启服务的命令只能在前台执行;使用nohub CMD &等放在后台开启服务都会宕机;所以搜寻了Supervisor 这个解决办法,为服务创建守护进程。具体操作如下

1、什么是守护进程

  1.   在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。

本篇的创建守护进程,是指发布在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主进程创建一个守护进程。

在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。原因有两点:

  • 1、它是微软官方文档推荐的,降低学习成本。
  • 2、它并不一定是最好的,但一定是文档最全的。

2、认识 Supervisor

2.1 Supervisor 介绍

官方文档:http://supervisord.org/

  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今天非常活跃,但它并不是新软件。主管已存在多年,已在许多服务器上使用。

3、安装配置 Supervisor

3.1 各个平台安装Supervisor

(1)在 linux 中使用以下命令进行安装:

  • centos
  1. yum install supervisor
  • ubuntu
  1. sudo apt-get install supervisor
  • python
  1. pip install supervosor easy_install supervisor

(2)在 masOS 中直接使用brew工具进行安装即可:

  1. brew install supervisor

3.2 Supervisor 配置

(1)linux 安装完后会有一个主配置文件/etc/supervisord.conf,和一个/etc/supervisord.d 自配置文件目录

  1. $ ls /etc/supervisord.*
  2. /etc/supervisord.conf
  3. /etc/supervisor

  

(2)修改主配置文件,设置自配置文件生效的后缀

  1. $ vim /etc/supervisord.conf 在最后一行
  2. [include]
  3. files = supervisord.d/*.conf

  

(3)为了方便管理,就在自配置文件目录下,创建项目的配置文件

  1. $ cd /etc/supervisord.d/
  2. $ vim ProjectName.conf
  3. [program: ProjectName]
  4. command=dotnet ProjectName.dll ; 运行程序的命令
  5. directory=/usr/local/ProjectName/ ; 命令执行的目录
  6. autorestart=true ; 程序意外退出是否自动重启
  7. autostart=true ; 是否自动启动
  8. stderr_logfile=/var/log/ProjectName.err.log ; 错误日志文件
  9. stdout_logfile=/var/log/ProjectName.out.log ; 输出日志文件
  10. environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
  11. user=root ; 进程执行的用户身份
  12. stopsignal=INT
  13. startsecs=1 ; 自动重启间隔

  

3.3 启动 Supervisor 服务

(1)开启服务,并设为开机自启

  1. $ systemctl start supervisord.service
  2. $ systemctl enable supervisord.service
  3. Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.

(2)查询服务状态

  1. $ systemctl status supervisord.service
  2. supervisord.service - Process Monitoring and Control Daemon
  3. Loaded: loaded (/usr/lib/systemd/system/supervisord.service; disabled; vendor preset: disabled)
  4. Active: active (running) since Fri 2019-01-11 15:00:23 CST; 57min ago
  5. Process: 910 ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf (code=exited, status=0/SUCCESS)
  6. Main PID: 913 (supervisord)
  7. CGroup: /system.slice/supervisord.service
  8. ├─913 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
  9. └─914 dotnet eXiu.OBD.Host.dll
  10.  
  11. Jan 11 15:00:23 iZe4iwiics91xjZ systemd[1]: Starting Process Monitoring and Control Daemon...
  12. Jan 11 15:00:23 iZe4iwiics91xjZ systemd[1]: Started Process Monitoring and Control Daemon.

  

(3)查看进程认证

  1. $ ps -ef | grep dotnet ProjectName
  2. root 914 913 0 15:00 ? 00:00:05 dotnet ProjectName.dll
  3. root 3455 3058 0 15:58 pts/0 00:00:00 grep --color=auto dotnet

4、报错处理

(1)使用Supervisor 为服务创建守护进程失败

  1. Error: Another program is already listening on a port that one of our HTTP servers is configured to use.
  2. Shut this program down first before starting supervisord.
  3. 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 服务被关闭了,重启启动服务即可。

5、supervisorctl 常用命令

  1. $ sudo service supervisor stop 停止supervisor服务
  2. $ sudo service supervisor start 启动supervisor服务
  3. $ supervisorctl shutdown #关闭所有任务
  4. $ supervisorctl stop|start program_name #启动或停止服务
  5. $ supervisorctl status #查看所有任务状态

 

Supervisor 为服务创建守护进程的更多相关文章

  1. ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)

    前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程 ...

  2. 创建守护进程步骤与setsid() -- linux deamon进程

    原创:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且 ...

  3. ASP.ENT Core Linux 下 为 donet创建守护进程(转载)

    原文地址:http://www.cnblogs.com/savorboard/p/dotnetcore-supervisor.html 前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 ...

  4. linux创建守护进程

    守护进程deamon 是一个后台进程,无需用户输入就能运行,用来在系统后台提供某种服务. 常见的守护进程有Wbe服务器.邮件服务器以及数据库服务器等等.守护进程不能控制终端,所以任何的输入和输出都需要 ...

  5. .NET Core 部署到CentOS–2.创建守护进程, 通过Nginx公网访问

    继上一篇, 我们确定在内网可以通过 "http://localhost:5000",可以访问到站点后,接下来我们要配置"守护进程","Nginx公网8 ...

  6. 创建守护进程步骤与setsid()

    原创:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且 ...

  7. Linux控制服务和守护进程

    目录 控制服务和守护进程 1.systemd 1.1.systemd简介 1.2.systemd的新特性 1.3.systemd的核心概念Unit 2.使用systemctl管理服务 控制服务和守护进 ...

  8. Python中创建守护进程

    python 创建守护进程 python 的os.setdid()提供了类似linux c api的 setsid 也可以通过unix双fork创建守护进程. 几个相关的函数 os.umask(0) ...

  9. linux 创建守护进程的相关知识

    linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关 ...

随机推荐

  1. yii2 httpClient的用法

    yii2 httpClient的用法示例: <?php /* * @Purpose : yii2 httpClient 请求示例 * @Author : Chrdai * @Time : 201 ...

  2. TypeScript专题-Static和使用技巧

    class People { static _name: string; print() { //alert(this.name);// 编译不通过,doex not exist on type Pe ...

  3. mysql import error

    mysql导入文件一直出错,显示ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option s ...

  4. System.data.sqlclient.sqlexception:将截断字符串或二进制数据终止

    System.data.sqlclient.sqlexception:将截断字符串或二进制数据终止. 错误原因:输入的字符串长度超过数据库设置的长度

  5. mysql数据库内容相关操作

    第一:介绍 mysql数据内容的操作主要是: INSERT实现数据的插入 UPDATE实现数据的更新 DLETE实现数据的删除 SELECT实现数据的查询. 第二:增(insert) 1.插入完整的数 ...

  6. tomcat的下载与安装

    (1)下载Tomcat 官网地址:http://tomcat.apache.org/whichversion.html (2)安装Tomcat Tomcat有安装版和解压版(绿色版) 安装版以.exe ...

  7. Super Jumping! Jumping! Jumping! ---HDU - 1087

    Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. May ...

  8. 电子科技大学第九届ACM趣味程序设计竞赛(热身赛)题解

    比赛地址:http://acm.uestc.edu.cn/#/contest/show/191 A题 小羽涂色 题意: 在x轴的正半轴上,问你是否存在一段区间[L,R]其中包含r个奇数和g个偶数. 分 ...

  9. 深入理解Spring Redis的使用 (九)、通过Redis 实现 分布式锁 的 BUG,以及和数据库加锁的性能测试

    在多节点的项目中,经常要涉及到某些方法加锁的控制.而这个时候,简单易用的synchronized已经不能满足多节点的部署结构. 之前在项目中,用的比较多的是数据库的更新锁:for udpate.但是这 ...

  10. #Java学习之路——基础阶段(第九篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...