收到消息 停止耗时超过 120 秒 后,如何正确关闭 Neo4j 数据库
任何标准 Neo4j 安装的 bin/
目录下的 neo4j
脚本是关闭正在运行的 Neo4j 实例的主要方式。该脚本接受一个 stop
参数,它将通过发送 SIGTERM
信号来尝试关闭正在运行的实例,JVM 会将此信号解释为关闭命令并运行已安装的关闭钩子,Neo4j 实现这些钩子以确保干净关闭。
运行 bin/neo4j stop
时,会显示一条消息,指示进程正在停止。然后它会等待进程退出,默认等待 2
分钟,此时间由环境变量 $NEO4J_SHUTDOWN_TIMEOUT
控制(超时时间以秒为单位设置)。如果进程在 $NEO4J_SHUTDOWN_TIMEOUT
期间退出,shell 脚本将以状态码 0 退出;否则,它将打印一条失败消息并附带 Neo4j 进程的 PID,并返回状态码 1
。
重要的是要注意,在任何一种情况下,Neo4j 进程都将继续运行。原因通常是检查点操作花费的时间比平时长。如果发生这种情况,仍可以通过使用 bin/neo4j status
命令查询 Neo4j 进程的当前状态。如果进程正在运行并打印其 PID
,该命令将返回状态码 0
;如果进程未运行,则返回 3
。
上述方法允许通过两种方式检查已被要求关闭的 Neo4j 进程的状态。
一种是将 $NEO4J_SHUTDOWN_TIMEOUT
环境变量设置为大于 120
秒的值。如果大致知道预期的关闭时间并且希望命令能够终止,则首选此方法。
另一种是在 bin/neo4j stop
命令返回非 0
状态(表示进程仍在运行)后,使用 bin/neo4j status
命令的退出码来执行控制循环。在这种情况下,将 $NEO4J_SHUTDOWN_TIMEOUT
设置为一个较小的值可能是有意义的,以便尽快跳到控制循环。例如:
export NEO4J_SHUTDOWN_TIMEOUT=2 # in seconds
if [[! "${bin/neo4j stop}"]]; then
while [["${bin/neo4j status}"]];
sleep 1
echo "Still waiting..."
done;
fi
else, echo "Done, process is now shutdown, continue with whatever you want to do"
此页面有帮助吗?