0

在编写 unix 脚本时,我很困惑为什么脚本会出错。

剧本是这样的...

jvmpid=$(pidof java)
./jstat -gc $jvmpid

当我运行脚本时,它会出错:

格式错误的 VM 标识符:3492 用法:jstat -help|-options jstat - [-t] [-h] [ []]

定义:由 -options 选项虚拟机标识符报告的选项。vmid 采用以下形式: [@[:]] 目标 Java 虚拟机的本地 vm 标识符在哪里,通常是进程 ID;是运行目标 Java 虚拟机的主机名;并且是目标主机上 rmiregistry 的端口号。有关虚拟机标识符的更完整描述,请参阅 jvmstat 文档。标题行之间的样本数。
采样间隔。允许使用以下形式: ["ms"|"s"] 其中是整数,后缀指定单位为毫秒("ms") 或秒("s")。默认单位是“毫秒”。终止前要采集的样本数。-J 直接传递给运行时系统。

但是,如果我直接在 shell 中执行脚本的每一行,每个都可以正常工作。

有什么线索吗?我已经在网上搜索过帮助。

4

1 回答 1

1

我遇到了同样的问题,我把它解决了。问题似乎是变量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 脚本专家,因此这可能可以以更简洁的方式完成,但这是我发现的最佳方式。希望能帮助到你。

于 2016-03-31T14:41:45.240 回答