知识库

收到消息 停止耗时超过 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"
© . All rights reserved.