我们有一个构建文件,它执行 git checkout、编译 war、部署到 tomcat,然后 tail -f 是 catalina.log。如果执行此操作的 ssh 会话以某种方式终止,即使我们只 tail -f 日志,整个 tomcat 实例也会终止。显然这不是理想的情况,但我想知道为什么会发生这种情况以及如何修复它。
发生在 Gentoo 和 Ubuntu 上(即我在这两个系统上测试过这个)
答案1
不要从连接到终端的交互式 shell 运行守护进程。
配置要运行的守护进程适当地,由你的系统自带的任何守护进程管理程序管理,可以是s6-supervise
至launchd
。使用管理界面来启动或关闭守护进程。
当您的 SSH 连接丢失时,SSH 服务器进程会关闭它打开的伪终端的主端。这会导致将SIGHUP
发送到会话领导进程、顶级 shell 以及前台进程组中的所有进程。当bash
收到 时SIGHUP
,它会将 发送SIGHUP
给所有未被告知的子进程disown
。这当然包括tomcat
您从该交互式 shell 运行的进程。
守护进程不应有控制 TTY,也不应属于任何 TTY 已知的进程组或会话,以免非特权用户能够向它们发送随机且可能出乎意料的信号。从系统的守护进程监控程序运行它们将确保这一点以及守护进程状态的所有其他方面都为守护进程正确设置。许多守护进程监控程序也会自动处理守护进程的日志记录。
正确运行你的tomcat
守护进程。
进一步阅读
- 乔纳森·德·博因·波拉德(2001,2007)。设计 Unix 守护程序时应避免的错误. 常见问题答案。