gpt4 book ai didi

linux - 检测 Mongod 的端口何时在脚本中打开

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:26 26 4
gpt4 key购买 nike

我正在尝试编写一个启动 mongod 进程的 bash 脚本,等待它启动(即打开默认端口),然后通过 将一些命令传递给它mongo 外壳。我想要一些方法来等待 mongod 进程完全启动,这比 sleep 5 更具确定性。

这是目前的脚本:

set_up_authorization() {
echo "Setting up access control"
/path/to/mongo < configure_access_controls.js
}

wait_for_mongod_to_start() {
RETRIES=1000
CONNECTED="false"
echo "Waiting for mongod to start"
while [[ $RETRIES -ge 0 && $CONNECTED == "false" ]] ; do
RESPONSE=$(exec 6<>/dev/tcp/127.0.0.1/27017 || echo "1")
if [[ $RESPONSE == "" ]] # which should happen if the exec is successful
CONNECTED="true"
fi
RETRIES=$((RETRIES - 1))
done
if [[ $RETRIES -eq 0 ]] ; then
echo "Max retries reached waiting for mongod to start. Exiting."
exit 1
fi
echo "Mongod started"
}

./start_mongod_instance.sh
wait_for_mongod_to_start
set_up_authorization

虽然此脚本有效,但它会在执行失败时在终端上产生大量输出:

./initialize_cluster.sh: connect: Connection refused
./initialize_cluster.sh: line xx: /dev/tcp/127.0.0.1/27017: Connection refused

...对于所有 ~900 次失败的尝试都会重复。

以下似乎都没有摆脱终端日志记录:

exec 6<>/dev/tcp/127.0.0.1/27017 >/dev/null
OR
exec 6<>/dev/tcp/127.0.0.1/27017 2>/dev/null

我也试过使用以下方法:

ps -aux | grep "mongod" | wc -l 

但是具有 ps 列出的 pid 的进程并不等同于它的端口处于打开状态或接受连接。

任何方面的任何想法都将不胜感激 - 一种等待进程完全启动的更优雅的方式,或者一种摆脱终端过多日志记录的方式。

注意:我无权访问 nmapnc 来检查端口(这是在客户端的机器上)。

最佳答案

exec 有点特别。它影响当前 shell 的输出。这意味着您需要在运行端口检查之前重定向当前 shell 的 stderr:

host="localhost"
port="9000"
exec 2>/dev/null # redirect error here
while ! exec 3<>"/dev/tcp/${host}/${port}" ; do
echo "Waiting ..."
sleep 1
done

此外,您可能已经注意到我检查 exec 的退出状态而不是一些输出来决定端口是否打开。


如果您之后想重置它:

host="localhost"
port="9000"

# Copy fd 2 into fd 3 and redirect fd 2 to /dev/null
exec 3<&2 2>/dev/null

while ! exec 3<>"/dev/tcp/${host}/${port}" ; do
echo "Waiting ..."
sleep 1
done

# Copy back fd 3 into fd 2
exec 2<&3
echo "EE oops!" >&2

关于linux - 检测 Mongod 的端口何时在脚本中打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48468193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com