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

Jenkins执行npm run develop阻塞及后台进程存活问题求助

解决Jenkins远程执行Strapi npm run develop进程自动终止的问题

核心问题分析

Jenkins构建结束时会默认清理所有衍生子进程,即便用nohup和&后台执行,也可能因作业控制、文件描述符未关闭等原因被终止;同时日志输出未正确处理,也会导致无法确认服务是否真的启动成功。


具体解决方案

1. 完整重定向输出+脱离shell作业控制

确保Strapi的所有输出(标准输出/错误)都重定向到日志文件,同时用disown让进程脱离当前shell的管理,避免Jenkins结束时被清理:

export BUILD_ID=dontKillMe
export JENKINS_NODE_COOKIE=dontKillMe
# 重定向输出到日志文件,方便后续排查问题
nohup npm run develop > ./strapi-develop.log 2>&1 &
# 让进程脱离当前shell的作业控制
disown -h %1

执行后可以通过cat ./strapi-develop.log查看启动日志,确认服务是否正常启动。

2. 关闭多余文件描述符解决泄露问题

针对日志中提示的文件描述符泄露,启动时主动关闭标准输入,减少不必要的文件描述符占用:

nohup npm run develop > ./strapi-develop.log 2>&1 0<&- &
disown -h %1

0<&-表示关闭标准输入流,避免残留的描述符触发Jenkins的清理机制。

3. 加入启动验证脚本

在启动后添加端口检查,确保Strapi服务真正启动成功,避免出现假成功的情况:

# 启动服务
export BUILD_ID=dontKillMe
nohup npm run develop > ./strapi-develop.log 2>&1 &
STRAPI_PID=$!

# 等待服务初始化(根据项目实际启动时长调整sleep时间)
sleep 15

# 检查1337端口是否被监听
if ss -tuln | grep -q ":1337"; then
    echo "Strapi服务启动成功,PID: $STRAPI_PID"
else
    echo "Strapi服务启动失败,日志路径: ./strapi-develop.log"
    # 可选:终止未成功启动的进程
    kill $STRAPI_PID 2>/dev/null
    exit 1
fi

4. 用systemd管理进程(长期运行推荐)

如果需要Strapi持续稳定运行,不要依赖Jenkins的后台执行,直接用systemd托管进程:

  1. 创建systemd服务文件/etc/systemd/system/strapi-sggs-api.service:
[Unit]
Description=Strapi SGGS API Development Service
After=network.target

[Service]
Type=simple
User=jenkins
WorkingDirectory=/etc/jenkins_tmp/workspace/SGGS_QA_API
ExecStart=/usr/bin/npm run develop
Restart=always
RestartSec=3
Environment=NODE_ENV=development

[Install]
WantedBy=multi-user.target
  1. 在Jenkins构建步骤中执行:
sudo systemctl daemon-reload
sudo systemctl restart strapi-sggs-api.service
# 验证服务状态
sudo systemctl status strapi-sggs-api.service

这种方式下,进程由systemd负责管理,Jenkins构建结束后不会被终止,还能在异常退出时自动重启。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:45:19