linux 用pm2守护

2019-09-27 10:56:46 chenludaniel 阅读数 45

一.守护进程的前世今生

守护进程,英文名:“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 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官方文档

http://pm2.keymetrics.io/docs/usage/quick-start/#usage

2016-09-05 19:37:16 dl425134845 阅读数 8011

1、代码中使用了cluster进行多进程处理。


一、使用forever启动进程

cd  /目录/;/usr/local/npm/bin/forever start  --nouse-idle-notification --expose-gc --max-old-space-size=8192 NodeData.js;   【正常】

/usr/local/npm/bin/forever start  --nouse-idle-notification --expose-gc --max-old-space-size=8192 NodeData.js; 【正常】

/usr/local/npm/bin/forever start  --nouse-idle-notification --expose-gc --max-old-space-size=8192  /目录/NodeData.js; 【不正常

主要无法产生子进程


二、使用PM2 

刚开始挺好,重启就完蛋了。并且提示net相关的错误,查询相关资料,好像是PM2挂了,需要重装。悲剧。

并且关闭进程也不方便,好像说可以kill。


三、supervisor

暂时未使用。



相关文章:https://cnodejs.org/topic/53eb0b39f4b616a82f0ba1dd

2019-08-12 10:02:03 qq_36742720 阅读数 682

成功部署Yapi后,在没有守护进程之前存在一些问题:

  1.  应用程序运行在当前终端发起的子shell中,hangup信号中断后会导致应用退出,我们不可能在长期使用的环境中用一个终端去做长连接。
  2.  当服务器重启后,还是需要人工连上服务器启动服务。
  3.  进程出现意外终止,等人为发现再连上去开启,这样的反应显然已经慢了。

我们这里使用pm2,方法很简单:

  • 安装pm2

    npm i pm2 -g
  • 切换到yapi的vendors目录 执行pm2 start

pm2 start server/app.js  --watch

这样就实现了!

最后附上pm2的入门指南

https://imweb.io/topic/57c8cbb27f226f687b365636

 

2018-09-10 15:10:45 M_wolf 阅读数 1215
# 升级 PM2
$ npm install pm2@latest -g
$ pm2 update

# 安装
$ cnpm install pm2 -g

# 启动
$ pm2 start app.js				# 启动,守护进程和自动重启应用程序(node)
$ pm2 start app.py				# 启动,守护程序和自动重启应用程序(python)
$ pm2 start npm --start			# 启动,守护程序和自动重启节点应用程序
$ pm2 start bin/www --watch  		# 启动 koa 项目

# 停止
$ pm2 stop all					# 停止所有应用程序
$ pm2 stop 0					# 停止进程id为0的应用程序

# 删除进程
$ pm2 delete all				# 杀死并删除所有应用程序
$ pm2 delete 0					# 删除进程 id 为 0 的应用程序

# 重启所有应用程序
pm2 restart all

# 集群模式(仅限 Nodejs)
$ pm2 start app.js -i 4			# 在集群模式下启动4个应用程序
								# 它将负载平衡每个应用程序的网络查询
$ pm2 reload all				# 零秒停机重启
$ pm2 scale [app-name] 10		# 规模集群应用到10个进程

# 进程监控
$ pm2 list						# 列出 pm2 的所有流程
$ pm2 monit						# 显示每个应用程序的内存和 cpu 使用情况
$ pm2 show [app-name]			# 显示相关应用程序的所有信息

# 日志管理
$ pm2 logs						# 显示所有应用程序的日志
$ pm2 logs [app-name]			# 显示特定应用程序的日志
$ pm2 logs --json				# 日志 json 格式化
$ pm2 flush
$ pm2 reloadLogs

# 进程状态管理
$ pm2 start app.js --name="api"	# 启动应用程序,并将其命名为 “api”
$ pm2 start app.js --watch		# 重新启动文件,更改应用程序
2018-02-04 23:10:30 qq_28710983 阅读数 473

1: 使用这个命令安装     (npm install pm2@latest -g)

PM2使用命令

2: 启动服务:
     pm2 start xxxx.js;
     守护进程功能,挂掉以后还能重启;
3: 查看服务信息:
     pm2 list;
4: 查看信息:
        pm2 describe 0  (pm2 desc 0)
5: 查看日志:
     cat  日志文件  通过pm2 desc 0可以查找到日志路径
6: pm2 monit
7: 如果被杀掉了还会自动拉起来,有守护功能;
8:启动/停止服务 
   pm2 start/stop id  


集群部署

1: webserver的集群部署:
     pm2 start app/webserver/webserver.js -i 几个
     
2: 查看端口占用
    netstat   -anp


pm2命令

$ pm2 start app.js --name my-api # 命名进程
$ pm2 list               # 显示所有进程状态
$ pm2 monit              # 监视所有进程
$ pm2 logs               #  显示所有进程日志
$ pm2 stop all           # 停止所有进程
$ pm2 restart all        # 重启所有进程
$ pm2 reload all         # 0秒停机重载进程 (用于 NETWORKED 进程)
$ pm2 stop 0             # 停止指定的进程
$ pm2 restart 0          # 重启指定的进程
$ pm2 startup            # 产生 init 脚本 保持进程活着
$ pm2 web                # 运行健壮的 computer API endpoint (http://localhost:9615)
$ pm2 delete 0           # 杀死指定的进程
$ pm2 delete all         # 杀死全部进程