我想监控 Microsoft Exchange 横幅。
当我在控制台中运行命令时:
timeout 1 openssl s_client -connect 192.168.0.5:995 > /tmp/1.txt
输出:
tail -n 4 /tmp/1.txt:
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
+OK The Microsoft Exchange POP3 service is ready.
当我将此命令添加到 cron 时,我得到以下输出
tail -n 4 /tmp/1.txt
Start Time: 1488382801
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
cron 和控制台有什么区别?谢谢。
答案1
最有可能的是,当在 下运行时cron
,连接在远程服务器有机会发出其横幅之前就关闭了。这是因为openssl s_client
在其 stdio 和远程服务器的套接字之间运行双向连接:
- 它将 stdin 复制到套接字
- 它将套接字上接收到的数据复制到标准输出
当在 下运行时cron
,第一个副本会立即终止,因为 stdin 连接到/dev/null
.这导致openssl
立即退出。
您可以通过将openssl
的输入重定向到永久阻止的内容来缓解这种情况,或者更好的是,这样sleep 1
可以消除对 的需要timeout
。
尽管如此,等待一秒钟是一种特别脆弱的连接和等待横幅的方式。它不仅是一个相当短的超时,而且当收到横幅时,它甚至不会导致命令在超时到期之前退出。对于这样的事情,您正在寻找expect
.
顺便一提:
其他人可能会不同意,但我相信您在这个问题中使用“控制台”一词是不准确的。实际上,您会得到您首先描述的行为任何终端会话,除其他外,可以是:
- 一个 ssh 终端会话,
xterm
GUI 中的终端模拟器(类似或现代的替代品)- 一个
screen
窗口, - 串行调制解调器连接,
- 或实际的系统控制台。
我认为“控制台”一词应该专门指最后一个,但所有这些都是终端会话。
答案2
Cron 在您的作业中使用最少的环境变量集。并且可能会使用您在控制台中使用之外的其他功能。
当您在控制台和 cron 中使用它们时,您可以使用which <programname>
命令查看超时和 openssl 的位置。
您还可以PATH
在脚本的开头设置变量。