Apache Commons Daemon 1.6.1 介绍与选型指南

介绍 Apache Commons Daemon 1.6.1:jsvc/procrun 双形态、三进程模型、root 降权与崩溃拉起、官方用法及 systemd/JSW 选型对比。

Apache Commons DaemonApache Commons Daemon2026/10/18

Apache Commons Daemon 1.6.1 介绍与选型指南

目标:面向需要把 Java 服务端应用注册为 UNIX daemon(或 Windows 服务)的运维与开发工程师,梳理 Apache Commons Daemon 1.6.1 的定位、架构、特性、官方用法与选型结论。本文为 A1 认知篇,不做本地安装实测,全部论断基于官方文档与发布渠道联网查证,关键论断随文标注来源与查询日期(2026-10-18)。

一、信息基准

二、软件概述

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):

  1. 实现 Daemon 接口:编写实现该接口的类(如 MyClass),打包为 jar 后由 jsvc 启动;
  2. 约定方法模式:不实现接口,而是提供一个具备约定签名方法的类——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 的模块化与预览选项原样传给 JVMjsvc.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 WrapperYAJSW
许可Apache-2.0GPL-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 适合需要商业支持与成熟监控回调的闭源交付场景。

八、参考链接

  1. Apache Commons Daemon 组件主页:https://commons.apache.org/proper/commons-daemon/
  2. jsvc 官方文档:https://commons.apache.org/proper/commons-daemon/jsvc.html
  3. procrun 官方文档:https://commons.apache.org/proper/commons-daemon/procrun.html
  4. 下载页(1.6.1 发行包):https://commons.apache.org/proper/commons-daemon/download_daemon.cgi
  5. GitHub 只读副本:https://github.com/apache/commons-daemon
  6. 竞品来源:https://www.freedesktop.org/wiki/Software/systemd/ 、https://wrapper.tanukisoftware.com/ 、https://sourceforge.net/projects/yajsw/