当前位置: 首页 > news >正文

jenkins执行shell 找不到pm2

在 Jenkins 执行 Shell 时遇到pm2: command not found是非常常见的问题,根本原因是Jenkins 运行环境的 PATH 变量与用户登录环境不一致

以下是完整的解决方案,按推荐顺序排列:

1. 使用绝对路径(最可靠)

在 Jenkins 服务器上先查找 pm2 的真实路径:

bash

复制

which pm2 # 示例输出:/root/.nvm/versions/node/v16.15.1/bin/pm2

然后在 Jenkins Shell 中使用完整路径:

bash

复制

/root/.nvm/versions/node/v16.15.1/bin/pm2 restart your-app

2. 创建软链接(常用方案)

将 pm2 链接到系统 PATH 目录:

bash

复制

# 查找 pm2 路径 which pm2 # 输出如 /root/.nvm/versions/node/v16.15.1/bin/pm2 # 创建软链接(推荐 /usr/local/bin) sudo ln -s /root/.nvm/versions/node/v16.15.1/bin/pm2 /usr/local/bin/pm2 sudo ln -s /root/.nvm/versions/node/v16.15.1/bin/node /usr/local/bin/node sudo ln -s /root/.nvm/versions/node/v16.15.1/bin/npm /usr/local/bin/npm

3. 在 Jenkins Shell 中加载环境

在 Jenkins 的"执行 Shell"步骤开头添加:

bash

复制

# 加载系统环境变量 source /etc/profile # 如果使用 NVM,必须加载 NVM 脚本 export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # 然后执行 pm2 命令 pm2 restart your-app

4. 配置 Jenkins 全局环境变量

在 Jenkins 系统设置中:

  1. Manage Jenkins → System → Global Properties

  2. 勾选Environment variables

  3. 添加变量:

    • PATH/usr/local/bin:/usr/bin:/bin:/your/node/path

    • 或添加NODE_HOME/root/.nvm/versions/node/v16.15.1

5. 使用 npx(临时方案)

如果不想配置环境,可以直接使用 npx:

bash

复制

npx pm2 restart your-app

6. 权限问题处理

如果提示权限不足,确保 Jenkins 用户有权访问 pm2:

bash

复制

# 查看 Jenkins 运行用户 ps aux | grep jenkins # 如果是 jenkins 用户,建议用 root 运行或配置 sudo # 在 /etc/sudoers 中添加: jenkins ALL=(ALL) NOPASSWD: /usr/local/bin/pm2

然后在 Jenkins Shell 中使用:

bash

复制

sudo pm2 restart your-app

快速验证:在 Jenkins 中添加一个"执行 Shell"步骤,运行以下命令测试:

bash

复制

echo $PATH which node which pm2 pm2 --version

根据输出结果选择最适合你的解决方案。通常方案1或方案2能彻底解决大部分问题。

http://www.cnnetsun.cn/news/108683.html

相关文章:

  • AI训练场景下的革命性存储解决方案:突破性分布式系统架构全解析
  • RuoYi-Cloud-Plus SSE实时推送:企业级消息通信终极指南
  • 让智能家居“听懂人话”:我用4B模型+万条数据,教会了它理解复杂指令
  • ShawzinBot:Warframe音乐创作的全新革命
  • 超简单破解在市面上的流水灯,学会后你也可以在家里制作
  • 用Python调用EmotiVoice:语音合成脚本编写示例
  • 传统灯光控制软件不够用?QLC+带你突破舞台灯光设计瓶颈
  • 视觉语言导航实战:让AI听懂你的每一个指令
  • Python+Vue的志愿者招募管理系统 Pycharm django flask
  • 33、网络服务与安全技术解析
  • NarratoAI:零基础也能制作专业视频解说的AI神器
  • RQ任务日志管理:从混乱到有序的实战指南
  • Navicat x 达梦技术指引 | 模型设计
  • CAPL学习-SOME/IP交互层-值处理类函数1
  • AI HOME智能体:当存储遇上智能体,开启数据管理新纪元​
  • SystemInformer语言定制:从英文界面到多语言自由切换
  • 事件驱动架构中的消息可靠性:Watermill与RabbitMQ实战深度解析
  • Python+Vue的瑜伽体验课预约系统 Pycharm django flask
  • 彻底解决Git跨平台开发难题:专业.gitattributes模板集合
  • DAIR-V2X车路协同自动驾驶完全实战指南:从零搭建多模态感知系统
  • 腾讯混元视频生成模型完整技术解析
  • 突破传统瓶颈:如何用LightGlue实现图像特征匹配的极致性能
  • 5天从零掌握开源音乐合成:OpenUtau实战创作全流程
  • UniApp页面跳转后关闭原页面的完整指南:让应用流畅如丝
  • 政策 + 技术双驱动!安科瑞赋能农村能源革命,助力乡村振兴落地生根
  • 快捷键一键粘贴常用短语,复制粘贴告别Ctrl+C/V,打工人必备提高效率神器!
  • GifCapture:Mac端高效Gif录制工具完整指南
  • Pearcleaner Homebrew管理全攻略:告别繁琐命令行操作
  • 首款问世,深度进化——AI-HAZOPkit重塑风险分析“智”高点
  • 终极指南:NewGAN-Manager 足球经理头像配置生成器完全使用手册