我有大约300多台服务器来检查特定端口是否打开。
OpenSSL需要5分钟才能响应整个输出。但我不需要整个输出。我只是希望看到CONNECTED
消息,如果有效,会立即弹出。
所以,我使用下面的代码在几秒钟后终止OpenSSL。
示例输出:
[345534@localhost tmp]$ echo "x" | openssl s_client -connect 192.168.18.10:500
CONNECTED(00000003)
^C
为此,我正在使用:
echo "x" | openssl s_client -connect 192.168.18.10:500 &
sleep 4
echo "Teriminating openssl for cleanup."
pkill -f openssl
echo "done"
问题: 有没有办法捕获OpenSSL命令(在后台运行)输出而无需等待5分钟来确定是否建立了端口连接?
我已经尝试了以下程序,没有去:
echo "x" | openssl s_client -connect 192.168.18.10:500 > /tmp/_out &
sleep 4
a=$(</tmp/_out)
echo $a
pkill -f openssl
答案 0 :(得分:0)
为什么不使用timeout
而不必使用openssl
命令?
# save the exit code on the same line to prevent future bugs if
# someone inserts any code between the openssl call and the if block
timeout 4 openssl s_client -connect 192.168.18.10:500 >/tmp/_out 2>/tmp/_error; ec=$?
if ((ec == 124)); then
# openssl timed out
elif ((ec != 0)); then
# openssl failed
cat /tmp/_error
else
# openssl succeeded
cat /tmp/_out
fi
答案 1 :(得分:0)
您可以在$!中找到最近执行的后台(异步)命令的PID。你可能会这样做。
cat server_list | while read s; do
echo "x" | openssl s_client -connect 192.168.18.10:500 > /tmp/_out_$s &
export opensslPid=$!
# open a new shell, and send in background immediately
(sleep $timeOut; echo "Killed with timeout" >> /tmp/_out_$s; kill $opensslPid)&
done
您剩下的是监控/ tmp / 中的文件 *。
如果您不希望所有300个流程并行运行,您可以尝试https://unix.stackexchange.com/questions/272545/is-there-a-limit-to-processes-i-can-run-in-the-background或Bash: limit the number of concurrent jobs?
之类的操作