对于在 Java 平台上,部署过后台服务器的人来说,让 Java 程序以 Windows/Linux 服务 (daemon) 形式执行,是一个常见的问题,这里的以 “服务方式” 是指该程序会随系统启动而自动执行,甚至更好的话,该程序如果异常结束会被重新执行。过去,山姆锅跟多数的人一样,选择 Java Service Wrapper,不过自从它在 3.2.3 版本以后改了授权,虽然仍可以继续使用 3.2.3 版本,但相信很多人也跟我一样想寻找其他替代方案。

由于“影化身科技”的部署环境只在 Linux 系统,因此,本文着重在 Linux 系统上的解决方案,对于想要在 Windows 系统执行 Java 服务的人,您的选择相对较少。底下针对几个替代方案,山姆锅整理了他们各自的优缺点供您参考。

1. 使用 Shell script

这个方法基本上就是使用一个 init script(通常位于 / etc/init.d / 目录)来负责 Java 程序的启动与终止,好一点的还可以查看 Java 程序是否在执行中(但无法知道是否正常提供服务)。

对于想要在 Unix-like 系统,像是 Linux, FreeBSD 等,执行 Java 服务的人,这是个简单的方案,虽然少了监控 Java 服务在异常的情况下重新执行的功能。

优点:只需要一个 Shell script。

适用大部分 Unix-like 系统。

也适用 Java 以外的程序。

缺点:缺少监控的功能。

不适用 Windows 系统。

对于有其他行程 (process) 监控方法且只需在 Unix-like 系统上执行 Java 服务的人,建议采用这个方案。

2. 使用 Shell script + Monit

对于想采用第一种方案,但又想有异常监控功能的人,可以采用这个方案。简单地说:就是使用 Monit 来补足所欠缺的监控功能。Monit 提供的监控功能明显比 Java service wrapper 多。

优点:具备方案 1 的所有优点。

拥有完整的监控与警告功能。

缺点:Monit 的设定并不直觉。

不适用 Windows 系统。

对于只需要在 Unix-like 系统执行 Java 服务的人,建议采用这个方案。

3. 使用 YAJSW

YAJSW 的目的一开始就是要取代 Java service wrapper,这点从它的名称:”Yet Another Java Service Wrapper”可以得知。跟 Java Service Wrapper 很大不同点在于:YAJSW 采用 Java 与 Native 混合方式实现,不像 JSW 是 native 程序。

优点:支持多个平台。

可以使用 Groovy 客制化。

可以监控 Java 程序,必要时可以发出警告或重启。

支持 Mac OS 的 Launchd。

缺点:如果 JVM 的实现本身有问题,可能会跟被监控的程序一起发生故障。

耗用较多系统资源。

对于同时需要在 Unix-like 系统外执行 Java 服务,或者需要客制化功能的人,建议采用此方案。

4. 使用其他工具

其他方案,像是 Jsvc, Procrun 等,都有它们各自的问题导致不符合需要,像 Procrun 只支持 Windows 系统,而 Jsvc 可能会要自行编译 C 程序。虽然这些工具不符合“影化身科技”的需求,但提出来供符合需要人参考。

小结

在目前阶段,对于要让 Java 程序以服务形式执行又不想使用 Java service wrapper 的人,如果看了上面的介绍还是不清楚哪个方案适合您,山姆锅统一推荐方案 3: YAJSW。但请注意:“影化身科技”采用的是方案 2,也就是 Shell script + Monit!因为,本文一开始就强调:“影化身科技”只需要在 Linux 系统上部署 Java 服务。