私はこの奇妙な振る舞いをしています https://stackoverflow.com/q/46583758/2553194 しかし、再開して問題に再び焦点を合わせましょう:
次のようなシェルスクリプトを使用して起動された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:コマンドが見つかりません
したがって、Javaプログラムから[1]を実行できる場合と、実行できない場合があります。SO舞台裏で何かが起こっています。誰かができますか教えてください?
StackOverflowで同様の question を最初に投稿しましたが、問題はJavaプログラミングに関連している可能性があると考えましたが、そうではありませんでした。
ついに私たちは何が起こっているのかを見つけました。
私のJavaプログラムはシェルスクリプトで起動されます。スクリプトを手動で実行すると、ntpq
コマンドが見つかり、正常に呼び出されます。ソフトウェアが完全にデプロイされると問題が発生します。プログラムを存続させるcron
スケジュール済みデーモンを取得した最終環境ですが、PATH
によって確立されたcron
は、プロファイルが持っているPATH
とは異なります割り当てられました。
cronで使用される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
ここ 問題とさまざまな解決策のより良い説明を見つけることができます。