SSH远程执行JMeter后台命令报错:未知参数&
解决SSH执行nohup JMeter命令时的"Unknown arg: &"错误
我来帮你分析下问题根源,以及对应的解决办法:
问题原因
你在Here Document里把后台执行符&转义成了\&,这就踩坑了——远程服务器上的Shell没把这个&当成“让命令后台跑”的控制符,反而直接把它传给了JMeter,JMeter自然认不出这个奇怪的参数,就抛出了"Unknown arg: &"的错误。
修正方案
直接去掉&前面的反斜杠,同时建议加上输出重定向,避免nohup的输出阻塞SSH连接。修改后的代码片段如下:
ssh $masterIP << EOF nohup jmeter -n -t $JMETERWS/jmx/$jmxfilename -R $slavePrivateIP -GDISCOVERYURL=$domain -GREGION=$region -GDISCOVERYENV=$env -GSERVICE=$service -GRUNID=$runId -GTESTID=$testId -Gnumthread=$numthread -Gtime=$rampuptime -GSESSIONTIME=$sessiontime > nohup.out 2>&1 & EOF
补充说明
- 去掉
\后,远程Shell会正确识别&,让nohup启动的JMeter进程在后台运行,不会占用你的SSH会话。 - 加上
> nohup.out 2>&1是把JMeter的标准输出和错误输出都重定向到nohup.out文件,既避免了输出内容导致SSH挂起,也方便你后续查看运行日志排查问题。
另一种可选写法
如果你担心Here Document的变量解析问题,也可以直接把整个命令用双引号包裹,通过SSH的命令参数传递,效果是一样的:
ssh $masterIP "nohup jmeter -n -t $JMETERWS/jmx/$jmxfilename -R $slavePrivateIP -GDISCOVERYURL=$domain -GREGION=$region -GDISCOVERYENV=$env -GSERVICE=$service -GRUNID=$runId -GTESTID=$testId -Gnumthread=$numthread -Gtime=$rampuptime -GSESSIONTIME=$sessiontime > nohup.out 2>&1 &"
这种方式下,本地Shell会先替换所有变量,再把完整命令传给远程执行,同样能实现后台运行JMeter的需求。
内容的提问来源于stack exchange,提问作者anish ratnawat
相关产品推荐
相关产品推荐

