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

CentOS 7.6环境下Jenkins 2.346.2启动失败求助

Jenkins启动失败问题排查与解决

环境信息

  • 系统:CentOS 7.6
  • Jenkins版本:2.346.2
  • Java版本:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64(切换Java 11会触发新错误)

核心问题分析

1. JENKINS_JAVA_CMD变量初始化逻辑错误

/etc/rc.d/init.d/jenkins中初始化JENKINS_JAVA_CMD的代码存在逻辑缺陷:

candidates="
/etc/alternatives/java
/usr/lib/jvm/java-1.8.0/bin/java
/usr/lib/jvm/jre-1.8.0/bin/java
/usr/lib/jvm/java-11.0/bin/java
/usr/lib/jvm/jre-11.0/bin/java
/usr/lib/jvm/java-11-openjdk-amd64
/usr/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/jre/bin/java
"
for candidate in $candidates
do
  [ -x "$JENKINS_JAVA_CMD" ] && break
  JENKINS_JAVA_CMD="$candidate"
done

初始状态下JENKINS_JAVA_CMD为空,[ -x "" ]返回false,导致循环会遍历所有候选路径,但无法正确匹配可执行的Java路径,最终可能导致变量为空。

2. 端口占用与核心类加载失败

从jenkins.log可提取两个关键错误:

  • 端口占用:java.net.BindException: Address already in use,8089端口被占用导致Jetty启动失败
  • 类加载失败:java.lang.NoClassDefFoundError: hudson/util/HudsonFailedToLoad,Jenkins核心文件损坏,恢复备份war包后仍存在完整性问题

服务启动失败状态

执行systemctl status jenkins输出:

[root@localhost log]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2023-07-17 23:34:43 IST; 2s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 28719 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=1/FAILURE)
    Tasks: 72
   Memory: 1.8G
   CGroup: /system.slice/jenkins.service
           ├─26370 /bin/sh -xe /tmp/jenkins3788405557627827271.sh
           ├─26373 python3 main_exec_file.py
           ├─26762 /bin/python /bin/ansible-playbook ./play_books/build_image.yml
           ├─26876 /bin/python /bin/ansible-playbook ./play_books/build_image.yml
           ├─26890 /bin/sh -c /usr/bin/python /root/.ansible/tmp/ansible-tmp-1689616762.75-75003044585972/AnsiballZ_command.py && sleep 0
           ├─26891 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1689616762.75-75003044585972/AnsiballZ_command.py
           ├─28722 runuser -s /bin/bash root -c ulimit -S -c 0 >/dev/null 2>&1 ; /etc/alternatives/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /u...
           ├─28723 bash -c ulimit -S -c 0 >/dev/null 2>&1 ; /etc/alternatives/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkin...
           └─28724 /etc/alternatives/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins....

Jul 17 23:34:43 localhost.localdomain jenkins[28719]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Jul 17 23:34:43 localhost.localdomain jenkins[28719]: at java.lang.reflect.Method.invoke(Method.java:498)
Jul 17 23:34:43 localhost.localdomain jenkins[28719]: at Main._main(Main.java:342)
Jul 17 23:34:43 localhost.localdomain jenkins[28719]: at Main.main(Main.java:117)
Jul 17 23:34:43 localhost.localdomain runuser[28746]: pam_unix(runuser:session): session closed for user root
Jul 17 23:34:43 localhost.localdomain jenkins[28719]: [FAILED]
Jul 17 23:34:43 localhost.localdomain systemd[1]: jenkins.service: control process exited, code=exited status=1
Jul 17 23:34:43 localhost.localdomain systemd[1]: Failed to start LSB: Jenkins Automation Server.
Jul 17 23:34:43 localhost.localdomain systemd[1]: Unit jenkins.service entered failed state.
Jul 17 23:34:43 localhost.localdomain systemd[1]: jenkins.service failed.

系统磁盘状态

磁盘空间充足,排除磁盘满导致的问题:

[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  118G   68G   50G  58% /
devtmpfs                 3.8G     0  3.8G   0% /dev
tmpfs                    3.8G  132K  3.8G   1% /dev/shm
tmpfs                    3.8G   98M  3.7G   3% /run
tmpfs                    3.8G     0  3.8G   0% /sys/fs/cgroup
/dev/sda1               1014M  180M  835M  18% /boot
/dev/loop0               4.8M  4.8M     0 100% /var/lib/snapd/snap/yq/1787
/dev/loop1               182M  182M     0 100% /var/lib/snapd/snap/postman/179
/dev/loop3                56M   56M     0 100% /var/lib/snapd/snap/core18/2284
/dev/loop4               4.8M  4.8M     0 100% /var/lib/snapd/snap/yq/1792
/dev/loop2               182M  182M     0 100% /var/lib/snapd/snap/postman/178
/dev/loop6                56M   56M     0 100% /var/lib/snapd/snap/core18/2409
/dev/loop5                47M   47M     0 100% /var/lib/snapd/snap/snapd/16010
/dev/loop7                47M   47M     0 100% /var/lib/snapd/snap/snapd/16292
/dev/mapper/centos-home   19G   18G  809M  96% /home
tmpfs                    766M  4.0K  766M   1% /run/user/42
tmpfs                    766M   52K  766M   1% /run/user/0
overlay                  118G   68G   50G  58% /var/lib/docker/overlay2/07b6cb0d553b90b44b2a2bccb24a20e81637bd76d1cb149acf57eb3671dd6541/merged

Jenkins日志详情

Running from: /usr/lib/jenkins/jenkins.war
Exception in thread "Jenkins initialization thread" java.lang.NoClassDefFoundError: hudson/util/HudsonFailedToLoad
    at hudson.WebAppMain$3.run(WebAppMain.java:261)
Caused by: java.lang.ClassNotFoundException: hudson.util.HudsonFailedToLoad
    at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:538)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 1 more
java.io.IOException: Failed to start Jetty
    at winstone.Launcher.<init>(Launcher.java:206)
    at winstone.Launcher.main(Launcher.java:405)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at Main._main(Main.java:342)
    at Main.main(Main.java:117)
Caused by: java.io.IOException: Failed to bind to 0.0.0.0/0.0.0.0:8089
    at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:349)
    at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:310)
    at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
    at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:234)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at org.eclipse.jetty.server.Server.doStart(Server.java:401)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at winstone.Launcher.<init>(Launcher.java:202)
    ... 7 more
Caused by: java.net.BindException: Address already in use
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:461)
    at sun.nio.ch.Net.bind(Net.java:453)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:222)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:85)
    at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:344)
    ... 14 more
Running from: /usr/lib/jenkins/jenkins.war
Exception in thread "Jenkins initialization thread" java.lang.NoClassDefFoundError: hudson/util/HudsonFailedToLoad
    at hudson.WebAppMain$3.run(WebAppMain.java:261)
Caused by: java.lang.ClassNotFoundException: hudson.util.HudsonFailedToLoad
    at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:538)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 1 more
java.io.IOException: Failed to start Jetty
    at winstone.Launcher.<init>(Launcher.java:206)
    at winstone.Launcher.main(Launcher.java:405)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at Main._main(Main.java:342)
    at Main.main(Main.java:117)
Caused by: java.io.IOException: Failed to bind to 0.0.0.0/0.0.0.0:8089
    at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:349)
    at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:310)
    at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
    at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:234)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at org.eclipse.jetty.server.Server.doStart(Server.java:401)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at winstone.Launcher.<init>(Launcher.java:202)

已尝试操作

  • yum升级Jenkins
  • 修改Java路径并重启服务
  • 恢复jenkins.war.bak备份文件

解决方案步骤

1. 清理端口占用

  • 查找占用8089端口的进程:
    lsof -i :8089
    # 或
    netstat -tulpn | grep 8089
    
  • 终止占用进程(替换<PID>为实际进程ID):
    kill -9 <PID>
    
  • 清理残留的Jenkins进程:
    pkill -f jenkins
    

2. 修复Java路径初始化逻辑

编辑/etc/rc.d/init.d/jenkins,替换原有循环逻辑:

candidates="
/etc/alternatives/java
/usr/lib/jvm/java-1.8.0/bin/java
/usr/lib/jvm/jre-1.8.0/bin/java
/usr/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/jre/bin/java
/usr/lib/jvm/java-11.0/bin/java
/usr/lib/jvm/jre-11.0/bin/java
/usr/lib/jvm/java-11-openjdk-amd64
"
JENKINS_JAVA_CMD=""
for candidate in $candidates
do
  if [ -x "$candidate" ]; then
    JENKINS_JAVA_CMD="$candidate"
    break
  fi
done
# 强制指定Java路径(确保变量不为空)
export JENKINS_JAVA_CMD="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/jre/bin/java"

赋予脚本执行权限:

chmod +x /etc/rc.d/init.d/jenkins

3. 修复核心文件损坏

  • 备份Jenkins主目录:
    cp -r /var/lib/jenkins /var/lib/jenkins_backup
    
  • 下载官方2.346.2版本war包:
    wget https://get.jenkins.io/war-stable/2.346.2/jenkins.war -O /usr/lib/jenkins/jenkins.war
    
  • 清理临时文件:
    rm -rf /tmp/jenkins*
    

4. 重启服务验证

systemctl daemon-reload
systemctl restart jenkins
systemctl status jenkins

重启后检查UI访问情况,触发管道任务验证执行状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:31:13