私には奇妙な行動があります。空の文字列解析 ntpq コマンドの結果、しかし、引き続き質問に再び集中します。
次のシェルスクリプトを使用して起動されたJavaプログラムを実行しています。
#!/bin/bash
export PATH=.:$PATH
java -jar myJar.jar &
私のJavaコードでこのパイプコマンドを実行します。
ntpq -c peers | awk ' $0 ~ /^\*/ {print $9}'
NTP 同期サーバーのオフセットを取得します。
Javaプログラムでパイプコマンドを実行するには、上記の行を/ bin / shの引数として使用する必要があります。コマンドをパイプするのではなく、/bin/sh を直接実行します。
これはコンソールで実行するのと同じです。1
/bin/sh -c 'ntpq -c peers | awk '"'"' $0 ~ /^\*/ {print $9}'"'"''
出力例ntpq
remote refid st t when poll reach delay offset jitter
==============================================================================
*172.30.100.1 172.22.204.171 4 u 207 1024 377 1.490 53.388 49.372
それをawk
解析
53.388
一般的にうまくいきますが、時には不明な理由で[これは私の問題です]私のプログラムは正しく動作しません。数値を返すためにコンソールでパイプコマンドを実行すると、何も返されません。
Javaで生成された実行プロセスからエラーを修復すると、次のテキストが表示されます。
/bin/sh: ntpq: コマンドが見つかりません
だから時には実行することができます。1Javaプログラムでは時々できません。 SOの舞台裏で何が起きています。誰かが私を実現できますか?
答え1
私はもともと次のようなものを投稿しました。質問StackOverflowは、この質問がJavaプログラミングに関連している可能性があると思いましたが、そうではありません。
最後に、私たちは何が起こったのかを見つけました。
私のJavaプログラムはシェルスクリプトを使って起動します。スクリプトを手動で実行すると、ntpq
コマンドが正常に検出され、呼び出されます。ソフトウェアが完全に展開されると問題が発生します。最終環境にはcron
プログラムをアクティブに保ちますが、PATH
私たちが割り当てたプロファイルとは異なるビルダーを使用する予約された悪魔がありますcron
。PATH
PATH
クローンで使用:
.:/usr/bin:/bin
PATH
スクリプトを手動で起動するためのログイン情報を取得しました。
/usr/sbin:/usr/bin:/bin:/sbin:/usr/lib:/usr/lib64:/local/users/nor:
/usr/local/bin:/usr/local/lib:.
一般ntpq
的に
/usr/sbin/ntpq
ここ問題のより良い説明とさまざまな解決策を見つけることができます。