在编写unix脚本时,我很困惑为什么脚本出错。
剧本是这样的。。。
jvmpid=$(pidof java)
./jstat -gc $jvmpid
当我运行脚本时,它会出错:
格式错误的VM标识符:3492用法:jstat-help|-optionsjstat-[-t][-h][]]
定义:-options选项报告的选项虚拟机标识符。vmid包含以下内容形式:[@[:]]其中是目标的本地vm标识符Java虚拟机,通常是进程id;是运行目标Java虚拟机的主机的名称;和是目标主机。有关更完整的信息,请参阅jvm stat文档虚拟机标识符的描述。标题行之间的样本数
采样间隔。允许使用以下形式:["ms"|"s"]其中是一个整数,后缀将单位指定为毫秒("ms")或秒("s")。默认单位为"ms"。之前要采集的样本数量终止-J直接传递到运行时系统
但是,如果我直接在shell内执行脚本的每一行,每一行都可以正常工作。
有线索吗?我已经在网上搜索过了。
我遇到了同样的问题,我把它解决了。问题似乎是变量jvmpid没有"3492",而是"3492CRLF",因此jstat无法正确理解它。我已经编写了一个bash脚本,它使用printf将变量正确地格式化为十进制。printf在执行此操作时会出现错误,但会执行此操作。
JAVAPID=$(pidof java)
#Transform the pid into a valid decimal as the output of pidof has some escape characters. Also avoid printing the printf error
JAVAPID1=$(printf "%d" $JAVAPID 2> error.txt)
#Remove the error file generated by printf. Gave an error but did the job
rm -f error.txt
#Execute the command
jstat -gc $JAVAPID1
正如你所看到的,我不是bash脚本的专家,所以这可能可以用一种更干净的方式来完成,但这是我发现的最好的方式。希望能有所帮助。