我有这种奇怪的行为空字符串解析ntpq命令结果,但让我继续并重新关注问题:
我正在执行一个使用 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
通常情况下进展顺利,但有时由于未知的原因[这是我的问题]我的程序停止正常工作。当从控制台执行管道命令返回数字时,它不返回任何内容。
从java创建的执行进程中恢复错误,我得到了这个文本
/bin/sh: ntpq: 找不到命令
所以,有时我可以执行1从java程序,有时我不能。 SO 幕后正在发生一些事情。有人可以启发我吗?
答案1
我最初发布了类似的问题在StackOverflow中,认为问题可能与java编程有关,但事实并非如此。
最后我们发现发生了什么。
我的java程序是用shell脚本启动的。当我们手动执行脚本时,ntpq
命令被找到并成功调用。当软件完全部署时,问题就会出现。在最终环境中,我们有一个cron
预定的恶魔,它使我们的程序保持活动状态,但PATH
建立者与我们分配的配置文件cron
不同。PATH
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
这里您可以找到问题的更好描述和各种解决方案。