Apache Commons Daemon 1.6.1 介绍与选型指南
介绍 Apache Commons Daemon 1.6.1:jsvc/procrun 双形态、三进程模型、root 降权与崩溃拉起、官方用法及 systemd/JSW 选型对比。
Apache Commons Daemon 1.6.1 介绍与选型指南
目标:面向需要把 Java 服务端应用注册为 UNIX daemon(或 Windows 服务)的运维与开发工程师,梳理 Apache Commons Daemon 1.6.1 的定位、架构、特性、官方用法与选型结论。本文为 A1 认知篇,不做本地安装实测,全部论断基于官方文档与发布渠道联网查证,关键论断随文标注来源与查询日期(2026-10-18)。
一、信息基准
- 查询日期:2026-10-18。
- 版本依据:官网组件页页头显示 "Version: 1.6.1(Last Published: 31 May 2026)";官方下载页当前列出 "Apache Commons Daemon 1.6.1" 的 bin/src 发行包(dlcdn.apache.org)。两处一致,确认 1.6.1 为官方最新稳定版。
- 官方来源清单:
- 组件主页:https://commons.apache.org/proper/commons-daemon/
- jsvc 文档(UNIX 侧):https://commons.apache.org/proper/commons-daemon/jsvc.html
- procrun 文档(Windows 侧):https://commons.apache.org/proper/commons-daemon/procrun.html
- 下载页:https://commons.apache.org/proper/commons-daemon/download_daemon.cgi
- GitHub 只读副本:https://github.com/apache/commons-daemon
- Maven Central 旧坐标:https://repo1.maven.org/maven2/org/apache/commons/commons-daemon/maven-metadata.xml
二、软件概述
Apache Commons Daemon 用于把 Java 服务端应用运行为操作系统级的后台服务:UNIX 世界称 daemon(受信号控制),Windows 世界称 service(由服务控制接口管理)。本次介绍的版本为 1.6.1(官网组件页,2026-05-31 构建;查询日期 2026-10-18)。
官网《Introduction》一节给出的动机:Java 应用唯一的可移植入口是 public static void main(String[]),交互式应用可以靠 System.exit 退出,但服务型应用缺少"接收操作系统停机通知、执行收尾动作再退出"的可移植途径;自行用 ServerSocket 监听停机消息又存在系统级关机不通知、停机口令被攻击者利用两类风险。Commons Daemon 通过对接操作系统原生的服务控制机制解决该问题(来源:官网 Introduction,查询日期 2026-10-18)。
- 许可:Apache License 2.0(GitHub 只读副本 license 字段:Apache-2.0)。
- 组成:官网《Structure》一节明确组件由两部分构成——C 语言编写的操作系统接口层 + Java 编写的 Daemon API(
org.apache.commons.daemon包,最初源自 Jakarta Tomcat 4.0 项目)。 - 分发形态:1.6.1 通过官网下载页以 bin/src tarball/zip 分发;Maven Central 上
org.apache.commons:commons-daemon旧坐标仅到 1.0.9(2012 年,repo1 maven-metadata 实查),新版 Java API jar 随发行包提供,不经 Maven 分发。
三、核心架构
3.1 jsvc 与 procrun 双形态
官网《Platforms》一节:UNIX 及类 UNIX 平台使用 jsvc(Win32 上可经 Cygwin 运行,但官方建议 Windows 用户改用 procrun);Win32 平台使用 procrun,允许应用以 Windows 服务方式运行(来源:官网主页与 jsvc.html,查询日期 2026-10-18)。
3.2 jsvc 的三进程模型
按官网 jsvc.html《How jsvc works》:jsvc 由启动进程(launcher)、控制进程(controller)、受控进程(controlled process)构成。受控进程即主 Java 线程;JVM 崩溃时控制进程会在随后重启它。启动流程为:以 root 启动 → 初始化 JVM → 加载服务 → 通过 setuid()/setgid() + capabilities(Linux)降权到 -user 指定的非特权用户 → 调用服务的 start 方法 → 等待信号或轮询停止指令 → 依次执行 stop/destroy 并销毁 JVM(来源:jsvc.html,查询日期 2026-10-18)。
3.3 Java 侧接入方式
官网 jsvc.html《Using jsvc》给出两种方式(查询日期 2026-10-18):
- 实现
Daemon接口:编写实现该接口的类(如MyClass),打包为 jar 后由 jsvc 启动; - 约定方法模式:不实现接口,而是提供一个具备约定签名方法的类——
void init(String[] arguments)(打开配置、建监听套接字/线程)、void start()(启动工作线程)、void stop()(通知线程终止、关闭套接字)、void destroy()(销毁 init 中创建的对象)。Tomcat-4.1.x 采用接口方式,Tomcat-5.0.x 采用约定方法方式(jsvc.html 原文举例)。
3.4 关键命令行参数
jsvc 支持 -home/JAVA_HOME、-user(降权目标用户)、-cp/-classpath、-pidfile(默认 /var/run/jsvc.pid)、-outfile/-errfile(stdout/stderr 重定向)、-wait(等待服务就绪,单位秒、10 的倍数)、-restarts(自动重启上限:-1 无限、0 禁止、N 固定次数)、-stop(按 pidfile 停止)以及透传给 JVM 的 -D/-X 与 Java 9+ 模块选项(--add-opens、--module-path 等,另有 Java 11 --enable-preview、Java 21 --enable-native-access)(来源:jsvc.html《Starting jsvc》帮助输出,查询日期 2026-10-18)。
四、功能特性
| 特性 | 说明 | 官方来源 |
|---|---|---|
| 原生服务化 | UNIX daemon / Windows service 双形态 | 官网主页 Platforms 节 |
| 特权端口绑定后降权 | 以 root 完成特权操作(如绑定 <1024 端口)后切换到非特权用户运行 | 官网 jsvc.html Introduction |
| 崩溃自动拉起 | 控制进程在 JVM 崩溃后按策略重启受控进程,-restarts 限定次数 | jsvc.html How jsvc works / 帮助输出 |
| 就绪等待 | -wait 让启动方等到受控进程报告就绪,便于启动编排 | jsvc.html 帮助输出 |
| 信号控制停机 | 通过操作系统信号通知 JVM 即将关闭,应用可执行收尾逻辑 | 官网主页 Introduction |
| 新版 JDK 透传 | Java 9/11/21 的模块化与预览选项原样传给 JVM | jsvc.html 帮助输出 |
| 进程命名 | -procname 自定义进程名(仅 Linux/FreeBSD) | jsvc.html 帮助输出 |
五、快速上手
5.1 UNIX 侧:从发行包构建 jsvc
以下命令引自官网 jsvc.html《Building from source / Building from a release tarball》(https://commons.apache.org/proper/commons-daemon/jsvc.html ,查询日期 2026-10-18)。构建前置:GNU AutoConf(≥2.53)、ANSI-C 编译器(官方推荐 GCC)、GNU Make、Java Platform 2 兼容 SDK。
# 源码包先生成 configure 脚本
sh support/buildconf.sh
# 指定 JAVA_HOME 生成构建配置
./configure --with-java=/usr/java
# 或 export JAVA_HOME 后执行 ./configure
# 编译生成 jsvc 可执行文件
make
5.2 启动应用
引自 jsvc.html《Using jsvc》(查询日期 2026-10-18):
# 方式一:应用类实现 Daemon 接口
./jsvc -cp commons-daemon.jar:my.jar MyClass
# 方式二:应用类按 init/start/stop/destroy 约定方法编写
./jsvc -cp my.jar MyClass
常用生产参数组合(各参数含义见 jsvc.html 帮助输出):./jsvc -home $JAVA_HOME -user svcuser -pidfile /var/run/myapp.pid -outfile /var/log/myapp.out -cp my.jar MyClass。
5.3 Daemon 接口
org.apache.commons.daemon 包提供 Java API;官方文档的接入步骤即 3.3 节两种方式。Windows 侧对应用法见 procrun 官方文档(安装为 Windows 服务、prunsrv/prunmgr 工具)。
💡 说明:本文为认知篇,未在本地环境构建/运行 jsvc;发行包内含各平台构建说明,实际部署前请核对目标平台支持列表。
六、适用场景与限制
适用场景:
- Java 服务需要绑定 1024 以下特权端口后再降权运行(jsvc 的 root→user 降权路径为官方设计目标);
- 需要统一"启动、就绪等待、崩溃拉起、信号停机"的服务生命周期管理,且目标环境不便引入额外进程管理器;
- 同一套 Java 应用要同时交付 UNIX(jsvc)与 Windows(procrun)两种服务形态。
限制:
- jsvc 需要在目标机用 C 编译器构建(或获取对应平台预编译包),对环境有 GCC/Make/AutoConf 要求(jsvc.html);
- Java 侧 jar 与原生二进制需版本配套,升级时两端都要替换;
- Maven Central 不提供 1.x 之后版本的构件分发,依赖管理需自行处理(repo1 metadata 实查,2026-10-18);
- 若运行环境已有 systemd 且无需特权端口降权,直接编写 systemd 单元通常更简单(对比见第七节)。
七、同类选型对比
| 维度 | Commons Daemon 1.6.1(jsvc/procrun) | systemd 单元 | Tanuki Java Service Wrapper | YAJSW |
|---|---|---|---|---|
| 许可 | Apache-2.0 | GPL-2.0+(LGPL 部分库),随发行版分发 | 社区版(GPL-2.0)/ 商业版双轨 | LGPL(SourceForge/GitHub 社区维护) |
| 社区活跃度 | GitHub 只读副本 106★(2026-10-18,GitHub API);ASF 官方维护 | 非 GitHub 托管:freedesktop.org 官方项目,随各发行版持续演进 | 非 GitHub 托管:wrapper.tanukisoftware.com 官方站点 | 社区低频维护 |
| 版本节奏 | 2026-05 仍发布 1.6.1,长周期稳定维护 | 随发行版滚动更新 | 社区版/商业版双轨长周期维护 | 维护模式 |
| 兼容矩阵 | UNIX(jsvc,需 C 编译)+ Win32(procrun);透传 Java 9/11/21 选项 | Linux 专属(init 系统内建) | 跨平台,含 Windows 服务集成 | 跨平台(纯 Java 为主) |
| 特权端口降权 | 内建(root 启动 + -user 降权,Linux 走 setuid/setgid + capabilities) | 可用 Capabilities/AmbientCapabilities 等单元配置实现 | 提供,配置项较多 | 提供,配置较复杂 |
选型建议:Linux 新项目优先用发行版自带的 systemd 单元(零额外依赖、日志与开机自启一体化);需要 Windows 服务形态、或要绑定特权端口后降权且希望跨平台方案统一时选 Commons Daemon;Tanuki JSW 适合需要商业支持与成熟监控回调的闭源交付场景。
八、参考链接
- Apache Commons Daemon 组件主页:https://commons.apache.org/proper/commons-daemon/
- jsvc 官方文档:https://commons.apache.org/proper/commons-daemon/jsvc.html
- procrun 官方文档:https://commons.apache.org/proper/commons-daemon/procrun.html
- 下载页(1.6.1 发行包):https://commons.apache.org/proper/commons-daemon/download_daemon.cgi
- GitHub 只读副本:https://github.com/apache/commons-daemon
- 竞品来源:https://www.freedesktop.org/wiki/Software/systemd/ 、https://wrapper.tanukisoftware.com/ 、https://sourceforge.net/projects/yajsw/