跳到主要内容

重启

有三种重启——先用哪一个​

有两个同名的restart.sh,另外还有一个仅重新启动应用的方式。 “只需 6 秒的 Tomcat”这种说法不符合任何情况。

内容位置对象耗时
主机重启plantpulse-edge-docker/bin/restart.sh整个容器——清理残留后重新启动分钟级
堆栈重启$PE_HOME/bin/restart.sh网关所有模块——stop.sh + start.sh 作为一个进程运行约 150–210 秒
仅应用重启$PE_HOME/bin/restart-app.sh仅 Tomcat(应用)。Cassandra · HiveMQ · Node-RED 保持不变30–90 秒

大多数配置更改仅应用重启就足够了。只有需要重新启动 DB · MQTT · Node-RED 的场景(例如:mqtt.enable 切换)才需要堆栈重启。

仅应用重启(restart-app.sh)​

屏幕上的应用重启按钮和 POST /api/v1/system/restart 会在 3 秒后触发此操作。 也可以直接执行。

$PE_HOME/bin/restart-app.sh
# 30~90초 후
curl -s http://127.0.0.1/api/v1/edge | jq
如果下面的组件已停止运行,仅重启应用无法恢复

脚本会先检测 Cassandra(9042) · Redis(6379) · MQTT(1883),如果已停止运行,则会发出警告。因为即使仅重启应用,引导过程也必然失败(已知限制)。

为避免在“重启后无法恢复”上浪费时间,请先阅读该警告——在这种情况下,需要执行堆栈重启或先恢复该组件。

容器模式下仅重启应用不会使容器停止的原因

容器的 PID 1 监视器会在 Tomcat 进程消失时终止整个容器。 仅重启应用会使 Tomcat 在 30~90 秒内消失,因此会触发该监视。

因此,restart-app.sh 在启动时会创建 server/logs/.restart-in-progress 标记, 以告知“这是预期中的重启,请等待”,并在结束后删除它。此脚本在 Tomcat 进程树之外(setsid)运行, 因此即使在停止 Tomcat 时,它自身仍能存活并清除标记。

堆栈重启($PE_HOME/bin/restart.sh)​

在同一进程内依次运行 stop.sh 和 start.sh。

为什么采用“单个进程”——2026-07-02 事故

通过 ssh "stop.sh; start.sh" 远程执行时,如果仅断开 SSH 会话,可能会发生两种情况—— 要么被遗弃在停止状态(start 无法开始),要么另一侧运行较晚的进程将已启动的堆栈再次停止。

因此,无论 stop 的结果如何,此脚本必须继续执行 start(保持停止状态是最糟糕的情况),并将结果写入标记文件,以便调用方确认完成。

远程调用方式如下。

ssh 박스 "RESTART_RUN_ID=xyz nohup setsid $PE_HOME/bin/restart.sh >/dev/null 2>&1 </dev/null &"
# 그다음 /tmp/pp-restart-xyz.done 을 폴링한다 (내용이 start.sh 의 종료 코드)

启动时逐个模块启动,并限制每个模块最多 300 秒 (防止某个模块无限等待导致整个引导过程停滞)。最后会检查最长 180 秒是否存活。


主机重启(plantpulse-edge-docker/bin/restart.sh)​

安全地重启网关。与systemctl restart不同之处在于它会先清除残留的垃圾数据。

sudo /opt/kopens/plantpulse-edge-docker/bin/restart.sh
如果仅执行systemctl restart,可能因名称冲突而失败

如果旧容器仍持有名称或存在僵尸进程,新容器将无法以 name already in use 启动。restart.sh 会先清理这些残留物,然后启动服务。

何时重启​

情况重启是否是答案
已更改配置(app.properties · 环境变量)是——配置在启动时读取一次
已更改驱动选项否——按连接停止并重新启动即可
看起来采集停止首先诊断和巡检——不了解原因就重启会丢失证据
已拉取新镜像不是重启,而是升级

确认​

cd /opt/kopens/plantpulse-edge-docker/bin
./status.sh
./health.sh
./logs.sh -f # 부팅을 따라가며 본다

更多信息​