如何通过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
相关产品推荐
相关产品推荐

