最近有个后端项目,用的是node,在持久化的时候会挂掉,详细了解到用的是nohup,然后先详细了解了一下nohup
nohup是一个Linux命令,用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行1nohup的英文全称是no hang up(不挂起)。
nohup为什么不稳定,可能有以下几个原因:
1.nohup命令只能保证程序在后台运行,但不能保证程序不会因为其他原因而终止,比如内存不足、程序异常、系统重启等。
2.nohup命令在默认情况下(非重定向时),会输出一个名叫nohup.out的文件到当前目录下,如果当前目录的nohup.out文件不可写,输出重定向到$HOME/nohup.out文件中
3如果这些文件被删除或者磁盘空间不足,可能会导致程序无法正常输出或者崩溃。
4.nohup命令在执行时,会将当前shell的标准输入、标准输出和标准错误输出全部重定向到/dev/null设备中,避免被关闭终端的信号所中断,但是,如果程序需要从标准输入读取数据或者向标准输出和标准错误输出写入数据,那么nohup命令可能会造成程序阻塞或者异常。
解决思路:
这个时候我想到了forever,因为之前碰到类似的问题,也写文章写了如何安装,但是在安装完之后碰到过一个问题,就是这个问题,但是当我安装完运行的时候报错如下
报错信息
(node:9352) Warning: Accessing non-existent property ‘padLevels’ of module exports inside circular dependency
找到了相关的解决方案是说这个错误是因为 Node.js 中存在循环模块依赖,导致在解析模块过程中访问了未定义的属性,node在高于node14以后就不支持循环依赖,所以会报错,如果切换node版本低于14或者12就不会有这个问题,但是,因为项目的版本是node16,所以切换版本是不可能的, 所以解决方案要么就是解决掉循环依赖的问题,要么就是换其他的持久化工具,综合条件下我选择了第二种,切换持久话工具,那就是pm2
PM2介绍
PM2 是一个守护进程管理工具,帮助您管理和守护您的应用程序。它以简单直观的 CLI 命令行方式进行工作。当然,pm2还有一个非常好用的功能就是开机自启动程序
1.安装pm2
上传文件到/home/tool/pm2 目录下,这个可以自己决定到那个目录,但是下面的路径需要和安装的路径保持一致,当然简单安装就是
npm install pm2 -g
但是问题就是重启之后pm2的环境变量就不见了,当然也有可能是个例,所以我选择了下面的安装方式
解压
tar -xvf pm2-5.2.2.tar
```3D&pos_id=img-Pg1mWqtc-1693447847522)创建软连接```javascript
ln -s /home/tool/pm2/pm2-5.2.2/bin/pm2 /usr/local/bin/pm2
2.执行pm2查看输出
安装完成后,在任何地方输入pm2会打印下面的信息
pm2
3.在程序的根目录下执行
cd /home/20230809
启动程序
pm2 start ./src/app.js --silent //--silent表示不需要日志,但是还是可以看到日志,奇怪
然后执行 ,看到status为 online表示当前为在线
pm2 ls
前台访问是正常的
常用维护命令:
停止所有的程序:
pm2 stop all
重新启动所有应用:
pm2 restart all
查看日志:
pm2 logs
更多的功能请访问官网了解
pm2中文官网
安装包地址
链接: https://pan.baidu.com/s/1XbeL48bGgR2oM14Uc9VCKw
提取码: xxxq