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

Ansible无法启动GoCD go-agent服务问题求助

Ansible无法启动Go Agent服务排查

问题描述

手动执行service go-agent start可正常启动Go Agent服务,但使用Ansible的systemd或service模块均无法启动服务,尝试过的两个Ansible任务如下:

任务1(systemd模块)

- name: start go-agent service
  systemd:
    name: go-agent
    enabled: yes
    state: started
    daemon_reload: yes
    masked: no

任务2(service模块)

- name: start go-agent service
  service:
    name: go-agent
    enabled: yes
    state: started

服务器配置信息

systemd服务文件(/etc/systemd/system/go-agent.service)

[Unit]
Description=go-agent
After=syslog.target

[Service]
Type=forking
ExecStart=/bin/env /var/go/go-agent.sh
User=go
KillMode=control-group
Environment=SYSTEMD_KILLMODE_WARNING=true

[Install]
WantedBy=multi-user.target

启动脚本(/var/go/go-agent.sh)

#!/bin/bash
source /etc/default/go-agent
cd /var/lib/go-agent

# Get installed java version
VER=$(rpm -q --queryformat "%{VERSION}" java-1.8.0-openjdk.x86_64)

# Find the location of the installed java binary
JAVA=$(find /usr/lib/jvm -mount -name jre-1.8.0-openjdk-$VER*)/bin/java
exec ${JAVA} -Dcruise.console.publish.interval=10 -Xms128m -Xmx256m -Dgocd.agent.log.dir=/var/log/go-agent -Djava.security.egd=file:/dev/./urandom -Dagent.plugins.md5=950122d2619875fe04e845271cdf44dc -Dagent.binary.md5=sd97fys7dfs7dhf7wmwc8n== -Dagent.launcher.md5=bcm94rgnmortnjghgreg== -Dagent.tfs.md5=jfn3ud8fcv5t49if34fr== -jar /var/lib/go-agent/agent.jar -serverUrl https://server:port -sslVerificationMode NONE &

手动启动后的进程信息

[root@server]# service go-agent start
Started Go Agent.
[root@server]# ps aux | grep go-agent
go       28528 14.9  3.9 2546064 81264 ?       Sl   00:44   0:03 java -Dgocd.agent.log.dir=/var/log/go-agent -Dgocd.redirect.stdout.to.file=/var/log/go-agent/go-agent-bootstrapper.out.log -jar /usr/share/go-agent/agent-bootstrapper.jar -serverUrl https://server:port/go
go       28792 31.8  7.0 2302236 144372 ?      Sl   00:44   0:06 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.342.b07-1.amzn2.0.1.x86_64/jre/bin/java -Dcruise.console.publish.interval=10 -Xms128m -Xmx256m -Dgocd.agent.log.dir=/var/log/go-agent -Djava.security.egd=file:/dev/./urandom -Dagent.plugins.md5=950122d2619875fe04e845271cdf44dc -Dagent.binary.md5=sd97fys7dfs7dhf7wmwc8n== -Dagent.launcher.md5=bcm94rgnmortnjghgreg== -Dagent.tfs.md5=jfn3ud8fcv5t49if34fr== -jar /var/lib/go-agent/agent.jar -serverUrl https://server:port -sslVerificationMode NONE &
root     29307  0.0  0.0 121272   936 pts/0    S+   00:44   0:00 grep --color=auto go-agent
[QA3 root@exim0 go-agent]#

问题原因分析

  1. Systemd服务类型不匹配
    服务文件中设置Type=forking,要求启动脚本必须fork出子进程后父进程退出,但脚本最后使用exec ... &:exec会替换当前进程,加上&后后台运行,导致systemd无法正确识别服务启动状态——systemd会认为父进程退出即服务启动完成,但实际java进程是后台运行的子进程,systemd无法跟踪,因此判定启动失败。而手动执行service命令时,检测逻辑更宽松,因此能正常启动。

  2. 缺失PIDFile配置
    Type=forking模式下,systemd需要通过PIDFile字段跟踪服务主进程的PID,但当前service文件未配置该字段,进一步导致systemd无法确认服务是否成功启动。

  3. 脚本后台运行的冲突
    脚本最后加了&让java进程后台运行,而systemd管理服务时,更适合让进程在前台运行(由systemd负责后台管理),后台运行的进程会脱离systemd的控制。

修复方案

1. 修改Systemd服务文件

将服务类型改为simple(适配脚本中exec替换进程的行为,systemd可直接跟踪主进程),并添加WorkingDirectory替代脚本中的cd命令,同时去掉冗余的/bin/env(脚本自带shebang可直接执行):

[Unit]
Description=go-agent
After=syslog.target

[Service]
Type=simple
ExecStart=/var/go/go-agent.sh
User=go
KillMode=control-group
Environment=SYSTEMD_KILLMODE_WARNING=true
WorkingDirectory=/var/lib/go-agent

[Install]
WantedBy=multi-user.target

2. 修改启动脚本

去掉最后一行的&,让java进程在前台运行,由systemd负责管理后台:

#!/bin/bash
source /etc/default/go-agent

# Get installed java version
VER=$(rpm -q --queryformat "%{VERSION}" java-1.8.0-openjdk.x86_64)

# Find the location of the installed java binary
JAVA=$(find /usr/lib/jvm -mount -name jre-1.8.0-openjdk-$VER*)/bin/java
exec ${JAVA} -Dcruise.console.publish.interval=10 -Xms128m -Xmx256m -Dgocd.agent.log.dir=/var/log/go-agent -Djava.security.egd=file:/dev/./urandom -Dagent.plugins.md5=950122d2619875fe04e845271cdf44dc -Dagent.binary.md5=sd97fys7dfs7dhf7wmwc8n== -Dagent.launcher.md5=bcm94rgnmortnjghgreg== -Dagent.tfs.md5=jfn3ud8fcv5t49if34fr== -jar /var/lib/go-agent/agent.jar -serverUrl https://server:port -sslVerificationMode NONE

3. 更新Ansible任务

确保先更新服务文件、重载systemd daemon,再启动服务:

- name: Update go-agent systemd service file
  copy:
    content: |
      [Unit]
      Description=go-agent
      After=syslog.target

      [Service]
      Type=simple
      ExecStart=/var/go/go-agent.sh
      User=go
      KillMode=control-group
      Environment=SYSTEMD_KILLMODE_WARNING=true
      WorkingDirectory=/var/lib/go-agent

      [Install]
      WantedBy=multi-user.target
    dest: /etc/systemd/system/go-agent.service
    mode: '0644'

- name: Reload systemd daemon
  systemd:
    daemon_reload: yes

- name: Start and enable go-agent service
  systemd:
    name: go-agent
    enabled: yes
    state: started

4. 验证脚本执行权限

确保启动脚本有执行权限:

- name: Ensure go-agent script is executable
  file:
    path: /var/go/go-agent.sh
    mode: '0755'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:20:44