web-dev-qa-db-ja.com

/ bin / sh:ntpq:コマンドが見つかりません

私はこの奇妙な振る舞いをしています 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舞台裏で何かが起こっています。誰かができますか教えてください?

1
RubioRic

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

ここ 問題とさまざまな解決策のより良い説明を見つけることができます。

3
RubioRic