使用pm2配合WSL2部署时报错:未知选项--update-env
问题根因
这个问题和PM2本身无直接关联,核心由两个原因导致:
- 命令解析规则差异:WSL2默认使用的Bash shell与Windows Powershell对SSH命令的参数解析规则不同,Powershell中单引号包裹的字符串会原封不动传递给远程服务器,而Bash下如果存在引号转义、特殊字符解析问题,会导致PM2的
--update-env参数被异常截断或转义,触发报错。另外如果你的脚本里SSH端口使用了省略-p的简写格式(比如-22),WSL自带的OpenSSH不支持该简写,也会导致后续命令参数解析异常。 - 远程环境变量加载差异:非交互式SSH会话(即直接通过SSH传递命令执行的方式)默认不会加载远程用户的完整环境变量,若远程服务器存在多个PM2版本,非交互式会话可能调用到v2.5以下的低版本PM2(该版本区间不支持
--update-env参数),就会抛出未知选项错误,Powershell发起的SSH会话默认携带的环境变量更多,因此能调用到正确版本的PM2。
解决方案
方案1:调整远程命令传递方式(最推荐)
使用Here文档的方式传递远程命令,完全规避参数解析异常问题,修改后脚本内容如下:
ssh -t <name> -p <port> << EOF cd <foldername> git pull yarn build <appname> pm2 restart <appname> --update-env EOF
方案2:显式指定PM2绝对路径
如果是远程环境变量加载问题导致调用到低版本PM2,可手动指定正确的PM2路径:
- 手动SSH登录远程服务器,执行
which pm2获取PM2的绝对路径,示例返回结果为/home/user/.nvm/versions/node/v14.19.0/bin/pm2 - 将脚本中的PM2命令替换为绝对路径:
ssh -t <name> -p <port> 'cd <foldername>; git pull; yarn build <appname>; /home/user/.nvm/versions/node/v14.19.0/bin/pm2 restart <appname> --update-env'
方案3:兼容参数写法
如果不想调整脚本结构,也可以将--update-env替换为PM2兼容的短参数写法,规避部分解析异常:
ssh -t <name> -p <port> 'cd <foldername>; git pull; yarn build <appname>; pm2 restart <appname> --u'
内容的提问来源于stack exchange,提问作者PCPbiscuit
相关产品推荐
相关产品推荐

