EC2实例通过CodeDeploy部署时pm2命令未找到问题求助
解决CodeDeploy执行脚本时找不到pm2的问题
问题分析
手动在EC2实例中能正常执行pm2,但CodeDeploy部署时执行application_stop.sh报错pm2: command not found,核心原因是CodeDeploy Agent的执行环境与你手动登录时的shell环境不同:
- 手动登录时加载了nvm的环境变量,能找到pm2;
- CodeDeploy以root(或其他无nvm配置的用户)执行脚本,默认PATH里没有pm2的路径,且未加载nvm配置。
解决方案
方案1:脚本中直接使用pm2的绝对路径
修改application_stop.sh,把pm2替换为完整的绝对路径(不要用~,因为CodeDeploy的HOME环境变量不是ec2-user的):
#!/bin/bash #Stopping existing node servers echo "Stopping any existing node servers" /home/ec2-user/.nvm/versions/node/v16.15.1/bin/pm2 stop main
方案2:在脚本中加载nvm环境
如果后续还要用到nvm管理的其他命令,可以在脚本开头先加载nvm的配置文件,确保环境变量正确:
#!/bin/bash # 加载nvm环境 source /home/ec2-user/.nvm/nvm.sh #Stopping existing node servers echo "Stopping any existing node servers" pm2 stop main
方案3:将pm2软链接到系统全局PATH目录
你之前创建软链接时未指定目标目录,导致软链接只在当前目录生效,需要把软链接创建到系统默认PATH包含的目录(比如/usr/local/bin):
sudo ln -s /home/ec2-user/.nvm/versions/node/v16.15.1/bin/npm /usr/local/bin/npm sudo ln -s /home/ec2-user/.nvm/versions/node/v16.15.1/bin/node /usr/local/bin/node sudo ln -s /home/ec2-user/.nvm/versions/node/v16.15.1/bin/pm2 /usr/local/bin/pm2
执行完后,CodeDeploy的脚本就能直接使用pm2命令了。
内容的提问来源于stack exchange,提问作者Santosh
相关产品推荐
相关产品推荐

