You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins Agent报非法字节序列致命错误但保持连接的问题

Jenkins Agent systemd运行问题解答

背景

通过systemd管理Jenkins Agent,相关配置及脚本如下:

systemd单元文件

[Unit]
Description=Jenkins Agent

[Service]
User=myuser
WorkingDirectory=/home/myuser/jenkins
ExecStart=/bin/bash /home/myuser/jenkins/start-jenkins-agent.sh
Restart=always

[Install]
WantedBy=multi-user.target

启动脚本start-jenkins-agent.sh

cd /home/myuser/jenkins
# secret-file必须存在于当前目录并包含密钥
# 为确保Agent使用最新版本agent.jar,应对控制器升级场景
curl -sO https://myinfra.mysite.io/jenkins/jnlpJars/agent.jar
java -jar agent.jar -jnlpUrl https://myinfra.mysite.io/jenkins/manage/computer/myServer2/jenkins-agent.jnlp -secret @secret-file -workDir /home/myuser/jenkins
exit 0

迁移至systemd后出现异常:Jenkins服务器显示Agent连接正常、构建正常,但journalctl -f显示服务每20-30秒重启一次,报Invalid byte 1 of 1-byte UTF-8 sequence错误,而journalctl -u jenkins-agent未显示错误。


疑问解答

1. 为何journalctl -u jenkins-agent无错误,但journalctl显示服务频繁重启?

  • 日志查看方式差异:journalctl -u jenkins-agent默认显示该单元的历史日志,若未加-f(实时跟踪)或-e(跳转到最新日志)参数,可能看不到刚发生的重启及错误日志;而journalctl -f会实时输出所有系统日志,包含该服务的最新重启事件和Java进程的错误输出。
  • 日志级别过滤:journalctl -u jenkins-agent默认展示全级别日志,但如果错误日志被大量info级别的启动日志覆盖,可能需要通过-p err参数过滤错误级别日志才能看到问题。

2. 除日志冗余外,该问题是否有实际影响?

有明确的实际影响:

  • 资源浪费:每次重启都会重新下载agent.jar、启动JVM,反复消耗CPU、网络及磁盘IO资源;
  • 构建中断风险:若重启发生在构建执行过程中,可能导致构建失败或异常终止;
  • 稳定性隐患:频繁重启说明Agent进程无法持续运行,在高负载场景下可能引发更严重的服务中断;
  • 日志膨胀:大量重启日志会占用磁盘空间,增加后续问题排查的难度。

3. 如何解决Invalid byte 1 of 1-byte UTF-8 sequence错误?

该错误是Java解析JNLP配置时遇到非UTF-8格式内容导致的,可从以下方向排查修复:

(1)验证JNLP URL的有效性

手动下载并检查JNLP文件内容是否为合法XML:

curl -O https://myinfra.mysite.io/jenkins/manage/computer/myServer2/jenkins-agent.jnlp
cat jenkins-agent.jnlp
  • 若返回HTML错误页面(如证书警告、404/500错误):
    • 确保Agent机器信任Jenkins服务器的SSL证书(可将证书导入Java信任库,或在启动命令中添加-Djavax.net.ssl.trustStore=/path/to/truststore参数);
    • 确认JNLP URL中的myServer2是Jenkins中配置的Agent节点名称,路径无拼写错误。

(2)修复secret-file的编码问题

echo命令可能引入多余换行符或非UTF-8字符,重新生成文件:

printf '%s' 'secret_here' > secret-file

验证文件编码:

file secret-file

确保输出包含UTF-8字样,无字节顺序标记(BOM)。

(3)设置systemd服务的UTF-8环境

在systemd单元文件的[Service]段添加环境变量,确保Java运行在UTF-8环境:

[Service]
# 保留原有配置
Environment="LANG=en_US.UTF-8"
Environment="LC_ALL=en_US.UTF-8"

重新加载配置并重启服务:

sudo systemctl daemon-reload
sudo systemctl restart jenkins-agent.service

(4)优化启动脚本,避免重复下载agent.jar

每次重启都下载agent.jar会引发不必要的网络请求,修改脚本仅在文件不存在时下载:

cd /home/myuser/jenkins
if [ ! -f agent.jar ]; then
  curl -sO https://myinfra.mysite.io/jenkins/jnlpJars/agent.jar
fi
java -jar agent.jar -jnlpUrl https://myinfra.mysite.io/jenkins/manage/computer/myServer2/jenkins-agent.jnlp -secret @secret-file -workDir /home/myuser/jenkins

内容的提问来源于stack exchange,提问作者swagrov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:34:51