You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过API远程执行命令完成Next.js项目的重建与重启?

问题解决方案

核心问题分析

SSH执行命令属于非交互式非登录shell,默认PATH环境变量和手动登录终端时不一致,可能找不到pm2、yarn的可执行路径;同时用分号;分隔命令会导致前序命令失败后,后续命令仍强行执行,引发混乱。

修正后的执行方案

1. 修正命令串逻辑与环境变量问题

先在终端通过which pm2和which yarn获取命令绝对路径,替换到命令中;用&&替代;确保前序命令成功后再执行后续步骤:

cd /你的项目绝对路径 && \
pm2 stop all && pm2 delete all && \
git restore . && git clean -fd && \
git pull origin main && \
yarn install && yarn build && \
pm2 start yarn --name 'website' -- start
  • 新增git clean -fd:清除未跟踪的文件/目录,避免git拉取或构建时出错
  • 新增yarn install:确保拉取代码后依赖同步更新,防止构建失败

2. 更稳定的pm2启动方式:使用生态配置文件

在项目根目录创建ecosystem.config.js:

module.exports = {
  apps: [
    {
      name: 'website',
      script: 'yarn',
      args: 'start',
      cwd: '/你的项目绝对路径',
      env: {
        NODE_ENV: 'production'
      }
    }
  ]
};

修改SSH执行命令为:

cd /你的项目绝对路径 && \
pm2 stop all && pm2 delete all && \
git restore . && git clean -fd && \
git pull origin main && \
yarn install && yarn build && \
pm2 start ecosystem.config.js

此方式让pm2读取配置文件中的路径与环境变量,规避非交互式shell的环境差异问题。

3. 定位错误根源

修改SSH接口代码,捕获命令的错误输出:

$ssh = new SSH2(config('app-update.ssh-host'), config('app-update.ssh-port'));
if ($ssh->login(config('app-update.ssh-user'), config('app-update.ssh-password'))) {
    $command = 'cd ' . config('app-update.ssh-front-directory') . " && pm2 stop all && pm2 delete all && git restore . && git clean -fd && git pull origin main && yarn install && yarn build && pm2 start ecosystem.config.js 2>&1";
    // 2>&1 将错误输出重定向到标准输出,便于排查问题
    $output = $ssh->exec($command);
    return $output;
}

通过返回的输出可直接定位失败步骤,比如git拉取冲突、yarn构建报错等。

额外注意事项

  • 确保SSH用户拥有项目目录的读写权限,以及pm2的执行权限
  • 若服务器用nvm管理Node版本,需在命令开头加载nvm环境,示例:source ~/.nvm/nvm.sh && nvm use 18(根据实际Node版本调整)

内容的提问来源于stack exchange,提问作者Tactic Sugar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:05:11