从 Jenkins 2.332.1 和 2.335 开始,Linux 安装包使用 systemd 管理服务。RPM 与 deb 安装器会将 System V init 配置迁移到 systemd 覆盖配置中。
查看服务配置
使用以下命令,查看安装包与覆盖文件共同形成的当前 Jenkins 服务配置:
systemctl cat jenkins
# /etc/systemd/system/jenkins.service
#
# This file is managed by systemd(1). Do NOT edit this file manually!
# To override these settings, run:
#
# systemctl edit jenkins
#
# For more information about drop-in files, see:
#
# https://www.freedesktop.org/software/systemd/man/systemd.unit.html
#
[Unit]
Description=Jenkins Continuous Integration Server
Requires=network.target
After=network.target
[Service]
Type=notify
NotifyAccess=main
ExecStart=/usr/bin/jenkins
Restart=on-failure
SuccessExitStatus=143
# /etc/systemd/system/jenkins.service.d/override.conf
[Service]
Environment="JAVA_OPTS=-Djava.awt.headless=true"
覆盖服务配置
在运行 systemd 的现代 Linux 发行版上,服务单元文件位于:
| 发行版 | 路径 |
|---|---|
| Debian | /lib/systemd/system/jenkins.service |
| Red Hat | /usr/lib/systemd/system/jenkins.service |
| openSUSE | /usr/lib/systemd/system/jenkins.service |
主服务单元是只读的,不应手动编辑。文件顶部也有醒目的只读提示。
可以在服务的 drop-in 单元,也就是 override.conf 文件中覆盖值。执行:
# systemctl edit jenkins
文件保存在 /etc/systemd/system/jenkins.service.d/override.conf,用于自定义服务。服务相关设置需要放在 [Service] 部分才会生效。示例内容:
[Unit]
Description=My Company Jenkins Controller
[Service]
# Add JVM configuration options
Environment="JAVA_OPTS=-Djava.awt.headless=true -XX:+UseStringDeduplication"
# Arbitrary additional arguments to pass to Jenkins.
# Full option list: java -jar jenkins.war --help
Environment="JENKINS_OPTS=--prefix=/jenkins --javaHome=/opt/jdk-21"
# Configuration as code directory
Environment="CASC_JENKINS_CONFIG=/var/lib/jenkins/configuration-as-code/"
systemctl edit jenkins 会以 root 身份创建 drop-in 文件,权限为 0644,即 -rw-r--r--。迁移逻辑则以 root 创建权限为 0600,即 -rw------- 的文件。
如果在覆盖配置中保存 HTTPS 密钥库路径或密码,同时又直接在控制器上运行作业,这一区别可能影响安全。Jenkins 项目明确不建议在控制器上直接运行作业。拿不准时,可用 chmod 将覆盖文件权限设为 0600。
drop-in 单元统一了 Debian、Red Hat 和 openSUSE 三类发行版的配置方法,且升级时不会被覆盖。
与 System V init 配置不同,override.conf 只包含自定义项,不包含原始默认值。习惯修改现成默认值的用户,应在编辑时同时参考只读服务单元,或运行 systemctl edit jenkins --full,复制原始服务单元,而不是创建 drop-in。
通过 systemctl edit jenkins 编辑会自动重新加载 systemd 配置,设置在下次 Jenkins 重启时生效。如果不用 systemctl 编辑,则需要自行运行 systemctl daemon-reload。
还应了解服务单元中的 specifier(说明符)。drop-in 不进行 shell 展开,但可以使用说明符插入主机名、单元名称、操作系统内核版本等上下文信息。systemd 文档提供了可用说明符列表。
启动服务
定义服务后,运行:
# systemctl start jenkins
如果 Jenkins 没有在配置的时间内报告启动完成,systemd 会认为启动失败并再次关闭服务。
每达到一个初始化里程碑,超时期限都会增加 jenkins.model.Jenkins.extendTimeoutSeconds 系统属性指定的时长,默认 15 秒。这些里程碑包括开始初始化、列出所有插件、准备所有插件、启动所有插件、增强所有扩展、加载系统配置、适配系统配置、加载所有作业、更新全部作业配置,以及完成初始化。
可以通过服务单元中的 TimeoutStartSec 指令配置启动超时。
停止服务
# systemctl stop jenkins
重启服务
# systemctl restart jenkins
重新加载服务定义
修改配置文件后,可能需要重新加载服务定义:
# systemctl daemon-reload
查看服务日志
journalctl -u jenkins
清理服务日志
systemd 保存的日志通常会自动轮转。如果需要缩减日志占用,可以运行:
journalctl --vacuum-size=500M
查看服务状态
使用 systemctl status jenkins 查看状态。下面是几个示例。
升级插件之后:
systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/jenkins.service.d
└─override.conf
Active: active (running) […]
Main PID: […] (java)
Status: "Restart in 10 seconds"
Jenkins 正在关闭:
systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/jenkins.service.d
└─override.conf
Active: deactivating (stop-sigterm) since […]
Main PID: […] (java)
Status: "Stopping Jenkins"
Jenkins 正在启动:
systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/jenkins.service.d
└─override.conf
Active: activating (start) since […]
Main PID: […] (java)
成功启动后:
systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/jenkins.service.d
└─override.conf
Active: active (running) since […]
Main PID: […] (java)
延伸阅读
原文推荐 DigitalOcean 的 systemd 服务与单元教程、Fedora 的 systemd 理解与管理指南、freedesktop.org 的 systemd 参考文档,以及 Debian Wiki 的 systemd 页面。相关链接可从原文访问。
原文:Managing systemd services。作者/维护方:Jenkins 文档维护者。本文为中文翻译,代码及命令保留原文。











暂无评论内容