知识库

收到消息 took more than 120 seconds to stop 后如何正确关闭 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 进程的当前状态。该命令在进程运行时返回状态码 0 并打印其 PID,如果未运行则返回 3

上述方法提供了两种检查已请求关闭的 Neo4j 进程状态的手段。

一种方法是将 $NEO4J_SHUTDOWN_TIMEOUT 环境变量设置为大于 120 秒的值。如果大致知道关闭所需时间,并希望使用简单的终止命令,这是更优的做法。

另一种方法是使用 bin/neo4j status 命令的退出码,在 bin/neo4j stop 命令返回非 0 状态(表示进程仍在运行)后执行控制循环。在这种情况下,可以将 $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"
© . This site is unofficial and not affiliated with Neo4j, Inc.