Ubuntu 16.04.4下Jenkins莫名停止监听8080端口求助
结合你描述的现象和给出的配置文件,咱们来一步步分析并解决这个问题:
问题现象回顾
- Jenkins运行一段时间后Web界面返回「拒绝连接」,执行
lsof -i -P -n | grep LISTEN发现8080端口无进程监听 - 查看Jenkins日志
cat /var/log/jenkins/jenkins.log无任何输出 - 执行
service jenkins start无反应,但service jenkins restart能恢复正常
核心原因分析
从现象来看,最可能的两个方向:
- PID文件残留:Jenkins进程异常退出后,
/var/run/jenkins/jenkins.pid文件没被自动清理,启动脚本通过这个文件判断进程还在运行,所以start命令无动作;而restart会强制清理旧进程(不管是否存在)再启动,因此能恢复。 - Java进程被系统强制终止:比如触发了OOM Killer(内存不足),这种情况下Jenkins来不及写入日志到指定文件,直接被系统杀死,导致日志为空、进程消失。
具体排查步骤
1. 验证PID文件残留问题
当问题出现时,执行以下命令:
# 查看PID文件中的进程ID cat /var/run/jenkins/jenkins.pid # 检查该PID对应的进程是否真的存在 ps -p <上面得到的PID>
如果PID文件有内容,但ps命令显示进程不存在,就坐实了PID文件残留的问题。
2. 从系统日志找崩溃线索
Jenkins日志为空的话,系统日志大概率会留下痕迹:
# 查看系统syslog日志 tail -n 50 /var/log/syslog # 查看内核日志,重点找OOM或Jenkins相关报错 dmesg | grep -i jenkins dmesg | grep -i oom
如果看到类似「Out of memory: Killed process
3. 检查文件描述符限制
你的配置里设置了MAXOPENFILES=8192,但需要确认这个限制是否真的生效:
# 查看jenkins用户的文件描述符限制 su - jenkins -c "ulimit -n" # 查看运行中Jenkins进程的实际限制(正常运行时执行) cat /proc/$(pidof java)/limits | grep -i open
如果实际限制远低于8192,可能导致Jenkins打开过多文件后崩溃。
针对性解决方案
方案1:修复PID文件残留问题
针对SysVinit(使用service命令的系统)
编辑/etc/init.d/jenkins脚本,在start函数开头添加以下逻辑,自动清理无效的PID文件:
if [ -f "$PIDFILE" ]; then PID=$(cat "$PIDFILE") if ! ps -p "$PID" > /dev/null 2>&1; then echo "Removing stale PID file $PIDFILE" rm -f "$PIDFILE" fi fi
保存后执行chmod +x /etc/init.d/jenkins确保脚本权限正常。
针对Systemd系统
编辑/lib/systemd/system/jenkins.service,确保以下配置存在:
PIDFile=/var/run/jenkins/jenkins.pid Restart=on-failure RestartSec=5
然后执行systemctl daemon-reload和systemctl restart jenkins,让Systemd自动监控并重启崩溃的Jenkins进程。
方案2:排查并解决内存问题
修改/etc/default/jenkins中的JAVA_ARGS,添加内存监控参数,方便定位OOM问题:
JAVA_ARGS="-Djava.awt.headless=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/jenkins/heapdump.hprof -Xlog:gc*:/var/log/jenkins/gc.log"
同时可以根据服务器内存情况调整堆内存,比如把注释掉的-Xmx1024m改成-Xmx2048m。
方案3:确保文件描述符限制生效
编辑/etc/security/limits.conf,添加以下内容:
jenkins soft nofile 8192 jenkins hard nofile 8192
重启服务器后,验证限制是否生效。
方案4:修复日志文件权限
如果Jenkins日志为空是因为没有写入权限,执行以下命令修复:
chown jenkins:jenkins /var/log/jenkins chown jenkins:jenkins /var/log/jenkins/jenkins.log
内容的提问来源于stack exchange,提问作者toraman

