SSH 会话关闭时的 liquibase 行为

liquibase behavior when SSH session is closed

我是通过 SSH 在服务器中 运行 一个 liquibase update。由于花费了很长时间并且我忘记使用 screen,SSH 会话已终止。

然后我再次 SSH 并 ps -A | grep liquibase,然后是 liquibase 进程。我的桌子还被锁着。

那么当 SSH 会话关闭时 liquibase 的行为是什么?它是继续工作,还是一直处于奇怪的边缘状态?

当终端关闭时,它会向该终端产生的所有进程发送信号 SIGHUP

SIGHUP 信号可以被 Java 应用程序捕获,显然这就是 liquibase 正在做的事情。查看源代码,似乎如果 SIGHUP 被捕获,liquibase 会尝试回滚事务,这可能需要一些时间并且可以保持数据库锁定。

源代码位于: https://github.com/liquibase/liquibase/blob/master/liquibase-core/src/main/java/liquibase/sdk/supplier/database/AllDatabases.java

相关代码开头为:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { ... }

请注意,SIGKILL(无法由进程处理)在终端关闭时不会发送到进程。