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") として指定します。デフォルトの単位は「ms」です。終了する前に取得するサンプルの数。-J ランタイム システムに直接渡します。

ただし、シェル内でスクリプトの各行を直接実行すると、すべて正常に動作します。

手がかりはありますか?私はすでにウェブでヘルプを検索しました。

4

1 に答える 1

1

私は同じ問題に直面し、それを整理しました。問題は、変数 jvmpid に「3492」ではなく「3492CRLF」があるため、jstat で正しく認識されていないようです。printf を使用して変数を正しく 10 進数にフォーマットする bash スクリプトを作成しました。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 に答える