cron 中和终端中的 openssl s_client 调用之间的区别

cron 中和终端中的 openssl s_client 调用之间的区别

我想监控 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 终端会话,
  • xtermGUI 中的终端模拟器(类似或现代的替代品)
  • 一个screen窗口,
  • 串行调制解调器连接,
  • 或实际的系统控制台。

我认为“控制台”一词应该专门指最后一个,但所有这些都是终端会话。

答案2

Cron 在您的作业中使用最少的环境变量集。并且可能会使用您在控制台中使用之外的其他功能。

当您在控制台和 cron 中使用它们时,您可以使用which <programname>命令查看超时和 openssl 的位置。

您还可以PATH在脚本的开头设置变量。

相关内容