• 使用 pm2 守护你的 .NET Core 应用程序


    一.守护进程的前世今生

    守护进程,英文名:“daemon",也有守护神的意思。守护进程是一个在后台运行并且不受任何终端控制的进程,不会随着会话结束而退出。诸如 mysql、apache 等这类程序默认就提供了守护进程或者以守护进程的方式工作,我们熟悉的 “mysqld”、"httpd" 等其中的 d 就是 daemon 的意思。比如我们在 Linux 系统上以命令 dotnet xxx.dll 运行 .NET Core 应用程序时,如果我们结束会话,那么我们的程序将会结束运行。其原因是 Linux 系统中有一个信号机制,进程可以通过一系列信号进行通信,当用户结束会话时,会向当前会话的子进程发送一个 HUP 信号,一般情况下当前会话的子进程收到HUP信号以后就会退出自己。 这时我们就需要一个守护进程来管控我们的 .NET Core 应用程序进程。

    二.让进程后台运行

    Linux 下让进程后台方式很多,举栗子:Supervisor、Screen、nohup 命令 等等。Supervisor 是自己创建了一个守护进程,然后让我们的应用程序进程成为其子进程,通过这种管控方式让我们的应用程序后台运行。nohup 顾名思义,就是不向会话进程发送hup信号。

    在这里我就搬出本文的主角 pm2,通过 pm2 来让进程后台运行。

    三. pm2介绍

    pm2 从名字上和我们平时在生活中接触到的 pm2.5 有点像,不过他们可不是一个东西。做 nodejs 开发的童鞋可能对 pm2 比较熟悉,pm2 是一个高级nodejs进程管理工具。

    img

    看到这里,可能有童鞋会有疑问,nodejs进程管理工具怎么管理 .NET Core 进程?博主经过长期的在 Linux 下的摸爬滚打,最终发现使用pm2来守护 .NET Core 进程完全没有问题,除了 nodejs 其他的很多程序都是可以的。而且无需繁琐的配置,安装、使用、管理进程都非常简单,这是我选择它的主要原因。

    这里需要说明一下是使用 pm2 来让进程后台运行,因为如果不是 nodejs 程序, pm2的一些为nodejs准备的功能可能是无法使用的,但是对于我们守护 .NET Core 应用程序足够了。

    四.pm2的安装以及使用

    4.1 安装

    4.1.1 安装 nodejs

    使用pm2需要安装nodejs,这个网上很多资料,就不再本文详细说明了,我前面写过一篇在 Centos 7下安装的文章,传送门

    4.1.2 安装 pm2

    npm install pm2 -g
    

    就一句话,是不是很简单。安装成功以后使用命令 pm2来检查是否安装成功,你会看到如下输出:

    
                            -------------
    
    __/\\\\\\\____/\\____________/\\____/\\\\\_____
     _/\/////////\\_/\\\________/\\\__/\///////\\___
      _/\\_______/\\_/\//\\____/\//\\_///______//\\__
       _/\\\\\\/__/\\///\/\/_/\\___________/\/___
        _/\/////////____/\\__///\/___/\\________/\//_____
         _/\\_____________/\\____///_____/\\_____/\//________
          _/\\_____________/\\_____________/\\___/\/___________
           _/\\_____________/\\_____________/\\__/\\\\\\\\_
            _///______________///______________///__///////////////__
    
    
                              Runtime Edition
    
            PM2 is a Production Process Manager for Node.js applications
                         with a built-in Load Balancer.
    
                    Start and Daemonize any application:
                    $ pm2 start app.js
    
                    Load Balance 4 instances of api.js:
                    $ pm2 start api.js -i 4
    
                    Monitor in production:
                    $ pm2 monitor
    
                    Make pm2 auto-boot at server restart:
                    $ pm2 startup
    
                    To go further checkout:
                    http://pm2.io/
    
    
                            -------------
    
    usage: pm2 [options] <command>
    
    pm2 -h, --help             all available commands and options
    pm2 examples               display pm2 usage examples
    pm2 <command> -h           help on a specific command
    
    Access pm2 files in ~/.pm2
    

    4.2 使用

    4.2.1 常用命令

    命令 说明
    pm2 startup 设置pm2开机自启动
    pm2 unstartup 移除pm2开机自启动
    pm2 save 保存当前进程开机自启动
    pm2 start <进程启动命令> [--name <进程名>] 启动应用程序
    pm2 list 显示所有进程状态
    pm2 monit 监控进程
    pm2 logs [进程id或名字] 显示进程日志
    pm2 stop [all] 停止[所有]进程
    pm2 restart [all] 重启[所有]进程
    pm2 delete [<进程名或者id>,all] 删除指定[所有]进程
    pm2 info [进程id或名字] 查看应用程序信息

    官方文档:http://pm2.keymetrics.io/docs/usage/quick-start/#usage

    五. 使用 pm2 守护 ASP.NET Core 应用程序

    5.1 创建一个 webapi 项目

    # 创建项目
    dotnet new webapi --no-https -o testwebapi
    # 发布项目
    cd testwebapi/
    dotnet publish -c Release
    cd bin/Release/netcoreapp2.1/publish
    # 运行项目
    dotnet testwebapi.dll
    

    运行成功会有如下输出:

    1539275616184

    5.2 使用pm2守护

    5.2.1 启动

    结束我们刚刚运行的程序,就在我们刚刚的目录执行下面的命令:

    pm2 start "dotnet testwebapi.dll" --name testwebapi
    

    执行成功:

    1539275651121

    我们可以清晰的看到我们的应用程序的 pid、运行状态、重启次数(应用程序崩溃重启/手动重启)、运行时间、cpu和内存占用等。十分方便

    使用 curl 访问 api 检查是否运行成功:

    curl http://localhost:5000/api/values
    

    1539275952810

    5.2.2 查看日志

    pm2 logs testwebapi
    

    1539275702867

    5.2.3 查看应用程序信息

    pm2 info testwebapi
    

    1539275756689

    5.2.4 监控应用程序

    pm2 monit testwebapi
    

    1539275847838

    5.2.3 重启策略

    pm2 会在你的应用程序异常退出时,自动帮你重启,所谓异常退出,指退出代码非0。

    测试:

    修改 ValueController 添加退出代码为1的代码:

    1539276422702

    发布,并使用 pm2 启动(此处略)。

    通过 pm2 list查询应用程序重启次数为0:

    1539276519474

    访问 api 触发异常退出:

    curl http://localhost:5000/api/values
    

    再次通过 pm2 list命令查询可以发现重启了:

    1539276596156

    六.结束

    pm2 这个工具相对于 Supervisor 和 nohup 来说,对于Supervisor,没有配置,不用输很长的命令;对于 nohup 管理进程方便。欢迎大家与我交流。

    pm2官方文档

    CentOS 7 源码编译安装 NodeJS by 晓晨Master

  • 相关阅读:
    条件语句的用法
    PHP取得当前文档所在的目录
    郁闷,一个语句调试很久
    PHP图片上传加水印(转)
    PHP多行多列分页
    ASP得到当前文件所在目录
    “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛D IP检测(绿)
    “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛E 成绩统计图(红)
    [面试备] 暴搜 or 二分图的经典升级 : hdu 1045 Fire Net 示例 [ 讲解之用 ]
    《C++ Primer》 第04章 [ 数组和指针 ]
  • 原文地址:https://www.cnblogs.com/stulzq/p/9775973.html
Copyright © 2020-2023  润新知