如何使用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进程管理工具。
看到这里,可能有童鞋会有疑问,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 EditionPM2 is a Production Process Manager for Node.js applications
with a built-in Load Balancer.Start and Daemonize any application:
$ pm2 start app.jsLoad Balance 4 instances of api.js:
$ pm2 start api.js -i 4Monitor in production:
$ pm2 monitorMake pm2 auto-boot at server restart:
$ pm2 startupTo 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 commandAccess 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/
五. 使用 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
运行成功会有如下输出:
5.2 使用pm2守护
5.2.1 启动
结束我们刚刚运行的程序,就在我们刚刚的目录执行下面的命令:
pm2 start "dotnet testwebapi.dll" --name testwebapi
执行成功:
我们可以清晰的看到我们的应用程序的 pid、运行状态、重启次数(应用程序崩溃重启/手动重启)、运行时间、cpu和内存占用等。十分方便
使用 curl 访问 api 检查是否运行成功:
curl http://localhost:5000/api/values
5.2.2 查看日志
pm2 logs testwebapi
5.2.3 查看应用程序信息
pm2 info testwebapi
5.2.4 监控应用程序
pm2 monit testwebapi
5.2.3 重启策略
pm2 会在你的应用程序异常退出时,自动帮你重启,所谓异常退出,指退出代码非0。
测试:
修改 ValueController 添加退出代码为1的代码:
发布,并使用 pm2 启动(此处略)。
通过 pm2 list
查询应用程序重启次数为0:
访问 api 触发异常退出:
curl http://localhost:5000/api/values
再次通过 pm2 list
命令查询可以发现重启了:
六.结束
pm2 这个工具相对于 Supervisor 和 nohup 来说,对于Supervisor,没有配置,不用输很长的命令;对于 nohup 管理进程方便。欢迎大家与我交流。
pm2官方文档
CentOS 7 源码编译安装 NodeJS by 晓晨Master
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对猪先飞的支持。
相关文章
- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文
时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25- Android应用程序启动时出现白色背景问题要如何来解决呢,我们下面就一起来看一篇关于启动时的一些小问题,具体的如下文介绍. Android应用程序开发过程中,为了使应用...2016-11-01
使用 Rails API 构建一个 React 应用程序的详细步骤
这篇文章主要介绍了使用 Rails API 构建一个 React 应用程序的详细步骤,主要包括后端:Rails API部分,前端:React部分及React组件的相关操作,具有内容详情跟随小编一起看看吧...2021-08-09Android应用程序组成部分 Manifest文件 Manifest文件节点
本文我们讲讲Android开发中比较高级的内容,应用程序组成部分,Manifest文件,Manifest文件节点,在Android平台的应用程序开发过程中,Manifest文件举足轻重。每一个应用程序...2016-09-20- 以下是本人如何关闭整个Android应用程序呢总结的几种比较简单的实现方法,后面附了一个详细的例子源码。 1. Dalvik VM的本地方法 android.os.Process.killProcess...2016-09-20
- 这篇文章主要介绍了C# WinForm应用程序降低系统内存占用方法总结,本文总结了9个方法,同时给出了一个定期清理执行垃圾回收代码,需要的朋友可以参考下...2020-06-25
- 下面小编就为大家带来一篇QT开发应用程序的欢迎界面实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
- 下面小编就为大家分享一篇基于asp.net MVC 应用程序的生命周期详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-09-22
- (一)简介 本文尝试对PHP程序加速的各个方面进行探索,包括必要性以及从不同角度采取的具体措施。希望有助于读者了解PHP程序加速,并应用于实际。 (二)是否需要...2016-11-25
- 今天我们来讲述一下简单的方法就是android开发之应用程序全屏实现方法,有需要的同学可以参考一下本文章。 一般Android的应用启动时都有欢迎界面,类似QQHD启动那样...2016-09-20
- Android监听应用程序安装和卸载实现程序,有需要的同学可参考一下。 代码如下 复制代码 package com.rongfzh.yc; import android.content.B...2016-09-20
- 这篇文章主要介绍了VC++实现文件与应用程序关联的方法,涉及VC++针对注册表的相关操作技巧,需要的朋友可以参考下...2020-04-25
“/”应用程序中的服务器错误和Server Error in ''/'' Application.的终极解决方法
“”应用程序中的服务器错误。 运行时错误 说明: 服务器上出现应用程序错误。...2016-01-27- 这篇文章主要介绍了如何开发一个渐进式Web应用程序PWA,对渐进式Web应用程序感兴趣的同学,可以参考下...2021-05-11
- 很多 Web 开发人员喜欢 PHP 的丰富功能和简单易用,但有时候他们需要访问 J2EE 应用程序服务器中已有的业务逻辑。本文将通过一些例子说明如何通过 PHP 5 中新的 SOAP...2016-11-25
II7添加应用程序测试时 无法验证对路径(c:\test\WcfService)的访问
今天在iis7中调试程序时,提示无法验证对路径c:\test\WcfService,通过下面的方法解决了,特分享下方便需要的朋友...2016-01-27- author: lajabs email: agl0dhlvqgdtywlslmnvbq== 本文以php作为描述语言较详细讲解堆排序原理 因保证程序可读性,故不做优化. php程序中关于堆的一...2016-11-25
Canonical通过Flutter启用Linux桌面应用程序(推荐)
这篇文章主要介绍了Canonical通过Flutter启用Linux桌面应用程序,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-10- 这篇文章主要介绍了PHP程序守护进程化实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-16