用 PM2 做进程管理 作者: ciniao 时间: 2023-01-02 分类: 技术 说到进程管理,后端和运维的同学都不陌生。生产项目以及一些脚本任务都需要进行进程管理。现在市场上用得最多的当属 supervisor 了,但是它只能运行在 Unix-Like 的系统上,也就是说 supervisor 不能再 windows 上运行。 我们这里说的是另外一个进程管理工具 PM2,PM2 不仅仅适用于 Unix-Like 系统,同样适用于 windows 系统。这点对于开发者来说也是个福音,下面我们来说说 PM2 的简单使用。 ####安装 **安装 nodejs 和 npm** ``` # 下载指定版本的nodejs,这里我们安装node14.17版本 wget https://nodejs.org/dist/v14.17.3/node-v14.17.3-linux-x64.tar.xz # 加压安装包 tar xvf node-v14.17.3-linux-x64.tar.xz # 重命名 mv node-v14.17.3-linux-x64 node # 移动到/usr/local mv node /usr/local # 制作软连接 ln -s /usr/local/node/bin/node /usr/bin/node ln -s /usr/local/node/bin/npm /usr/bin/npm ``` 安装好 nodejs 和 npm 后,运行下`node -v`测试下是否安装成功。 **安装 pm2** ``` npm install pm2 -g # 制作软连接 ln -s /usr/local/node/bin/pm2 /usr/bin/pm2 ``` 安装好之后,输入`pm2 -v`查看版本。 ####通过启动参数设置 启动一个应用: pm2 start test.py另外,我们可以在启动应用时添加相关参数 ``` # 给这个任务起名 --name {job_name} 或者 -n {job_name} # 文件更新时自动重启任务 --watch # 开启多进程 -i {num} # 设置应用重新加载的内存阈值 --max-memory-restart <200MB> # 定义日志路径 --log {log_path} # 脚本额外参数 -- arg1 arg2 arg3 # 不要自动重启应用 --no-autorestart # 设置cron定时任务 --cron {定时表达式} ``` ####通过配置文件设置 命令:pm2 start config.json还是以上述 test.py 为例,我们此时启动该程序要求 - 指定程序路径 - 指定 python 虚拟环境 - 指定日志输出路径 - 不要自动重启 为了满足上述需求,我们首先来看看 json 配置文件的主要参数 ``` # 主要参数 name: 任务名称 script: 脚本路径 cwd: 程序目录 args: 额外参数 interpreter: 虚拟环境 # 其他参数 watch: 是否监控文件改动重启 error_file: 错误日志路径 out_file: 正常输入日志路径 autorestart:是否要自动重启 ``` 根据参数,我们来写运行配置文件pm2.json ``` { "name": "test_pm2_101", "cwd": "/Users/ethan/Desktop/test/pm2_test", "script": "/Users/ethan/Desktop/test/pm2_test/test.py", "interpreter": "/Users/ethan/miniconda3/envs/data_manage/bin/python", "out_file": "/Users/ethan/Desktop/test/pm2_test/log.log", "error_file": "/Users/ethan/Desktop/test/pm2_test/error.log", "autorestart" : false } ``` 最后,我们来运行一下任务:`pm2 start pm2.json` **更多参数** ``` { app: { name: "wuwu", // 项目名 script: "./bin/www", // 执行文件 cwd: "./", // 根目录 args: "", // 传递给脚本的参数 interpreter: "", // 指定的脚本解释器 interpreter_args: "", // 传递给解释器的参数 watch: true, // 是否监听文件变动然后重启 ignore_watch: [ // 不用监听的文件 "node_modules", "logs", ], exec_mode: "cluster_mode", // 应用启动模式,支持fork和cluster模式 instances: 4, // 应用启动实例个数,仅在cluster模式有效 默认为fork;或者 max max_memory_restart: 8, // 最大内存限制数,超出自动重启 error_file: "./logs/app-err.log", // 错误日志文件 out_file: "./logs/app-out.log", // 正常日志文件 merge_logs: true, // 设置追加日志而不是新建日志 log_date_format: "YYYY-MM-DD HH:mm:ss", // 指定日志文件的时间格式 min_uptime: "60s", // 应用运行少于时间被认为是异常启动 max_restarts: 30, // 最大异常重启次数,即小于min_uptime运行时间重启次数; autorestart: true, // 默认为true, 发生异常的情况下自动重启 cron_restart: "", // crontab时间格式重启应用,目前只支持cluster模式; restart_delay: "60s", // 异常重启情况下,延时重启时间 env: { NODE_ENV: "production", // 环境参数,当前指定为生产环境 process.env.NODE_ENV REMOTE_ADDR: "爱上大声地", // process.env.REMOTE_ADDR }, env_dev: { NODE_ENV: "development", // 环境参数,当前指定为开发环境 pm2 start app.js --env_dev REMOTE_ADDR: "", }, env_test: { // 环境参数,当前指定为测试环境 pm2 start app.js --env_test NODE_ENV: "test", REMOTE_ADDR: "", } } } ``` ####设置 pm2 自启动 没设置前,服务器重启后,pm2 是不会自动重启的,因此我们的应用需重新启动了。设置方法很简单,输入`pm2 startup`,然后根据提示设置即可。 Windows系统不能直接使用pm2 startup需要安装对应插件 ``` npm install pm2-windows-startup -g pm2 save pm2-startup install ``` ####常用操作命令 ``` #启动一个应用 pm2 start #显示应用程序的所有信息 pm2 show {id} pm2 show {name} #查看应用状态 pm2 status pm2 ls #重启应用 pm2 restart {id} pm2 restart all #重新加载 pm2 reload {name} pm2 reload all #备注:{id}指的是 pm2 任务 ID,{name}指的是 pm2 任务的名称。下面例子都用{id}。 #查看应用日志 pm2 logs {id} #停止应用 pm2 stop {id} pm2 stop all #删除应用 pm2 delete {id} #查看应用详情 pm2 describe {id} #杀死pm2管理的所有进程 pm2 kill # 把名字叫www的应用扩展到3个实例 pm2 scale 'www' 3 #显示每个应用程序的CPU和内存占用情况.按键盘上下键切换 pm2 monit #清空logs pm2 flush #保存当前应用列表 pm2 save #重新加载保存的应用列表 pm2 resurrect ```  标签: none