Bash

/bin/sh: ntpq: 找不到命令

  • August 30, 2020

我有這種奇怪的行為Empty string parsing ntpq command result,但讓我繼續並重新關注問題:

我正在執行一個使用 shell 腳本啟動的 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

通常情況良好,但有時原因不明

$$ This is my question $$我的程序停止正常工作。當從控制台執行管道命令返回一個數字時,它什麼也不返回。 從java創建的執行程序中恢復錯誤,我得到了這個文本

/bin/sh: ntpq: 找不到命令

所以,有時我可以從 java 程序執行1,有時我不能。SO在幕後發生了一些事情。有人可以啟發我嗎?

我最初在 StackOverflow 中發布了一個類似的問題,認為該問題可能與 java 程式有關,但事實並非如此。

最後我們發現發生了什麼。

我的 java 程序是使用 shell 腳本啟動的。當我們手動執行腳本時,ntpq命令被找到並成功呼叫。當軟體完全部署時,問題就出現了。在最終的環境中,我們有一個cron預定的惡魔,它使我們的程序保持活力,但PATH建立的cronPATH我們的配置文件分配的不同。

PATH由 cron 使用:

.:/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

在這裡,您可以找到對問題的更好描述和各種解決方案。

引用自:https://unix.stackexchange.com/questions/399315