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 会尝试回滚事务,这可能需要一些时间并且可以保持数据库锁定。
相关代码开头为:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { ... }
请注意,SIGKILL
(无法由进程处理)在终端关闭时不会发送到进程。
我是通过 SSH 在服务器中 运行 一个 liquibase update
。由于花费了很长时间并且我忘记使用 screen
,SSH 会话已终止。
然后我再次 SSH 并 ps -A | grep liquibase
,然后是 liquibase 进程。我的桌子还被锁着。
那么当 SSH 会话关闭时 liquibase 的行为是什么?它是继续工作,还是一直处于奇怪的边缘状态?
当终端关闭时,它会向该终端产生的所有进程发送信号 SIGHUP
。
SIGHUP
信号可以被 Java 应用程序捕获,显然这就是 liquibase 正在做的事情。查看源代码,似乎如果 SIGHUP
被捕获,liquibase 会尝试回滚事务,这可能需要一些时间并且可以保持数据库锁定。
相关代码开头为:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { ... }
请注意,SIGKILL
(无法由进程处理)在终端关闭时不会发送到进程。