知识库

如何正确关闭 Neo4j 数据库,在收到 **停止时间超过 120 秒** 的消息后

任何标准 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 进程的当前状态。如果进程正在运行,则这将返回状态代码 0 并打印其 PID,或者如果它未运行,则将返回 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"