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

Ansible操作SunOS主机raw模块报错、shell模块执行脚本不生效求助

Ansible管控SunOS操作系统服务启动异常解决方案

问题根因

  1. 所谓Shared connection to myhost1 closed不是执行错误:该内容是SSH开启debug日志后会话正常关闭的提示输出,从返回码rc=0可确认命令已执行完成,无需针对该提示做额外处理。
  2. 进程启动后消失的核心原因:Ansible执行任务时会为每个任务创建独立的非交互式SSH会话,会话结束时会向会话内启动的所有子进程发送SIGHUP信号,未脱离会话的进程会被该信号强制终止。手动执行命令属于交互式登录会话,退出逻辑和信号处理逻辑与Ansible非交互式会话不同,所以手动执行可以成功。
  3. 此前disown配置无效:非交互式shell默认关闭作业控制功能,不存在作业号的概念,disown %%无法匹配到后台进程,无法完成进程脱离操作。
  4. 潜在命令兼容性问题:SunOS默认的/bin/sh不支持source内置命令,source是bash专属语法,在/bin/sh下需要用.代替source加载环境变量配置。

可行解决方案

使用修正后的raw模块任务配置即可解决问题:

- name: "START ADP SERVICES"
  raw: ". ~/.profile; nohup sh /web/external_products/springboot/{{ vars[ environ + '_folder'] }}/veladpservice/bin/start.sh veladpservice.jar {{ vars[ environ + '_folder'] }} {{ allpass }} > /var/tmp/veladpservice_start.log 2>&1 &"

配置修改说明

  • 将source ~/.profile替换为. ~/.profile,兼容SunOS默认/bin/sh的语法,确保环境变量正常加载
  • 新增nohup前缀,让进程忽略SIGHUP信号,避免SSH会话关闭时被强制终止
  • 新增输出重定向> /var/tmp/veladpservice_start.log 2>&1,将启动日志写入指定文件,也可改为> /dev/null 2>&1丢弃输出,避免nohup默认输出阻塞命令执行
  • 末尾新增&让进程后台运行

可选:添加服务启动校验任务

可在启动任务后添加校验任务,确认服务正常运行:

- name: "Verify ADP service is running"
  raw: "ps -ef | grep veladpservice.jar | grep -v grep"
  register: service_status
  retries: 3
  delay: 2
  until: service_status.rc == 0

注意事项

  • 若start.sh脚本内部已实现后台运行逻辑,可删除配置末尾的&,保留nohup即可
  • 若目标主机已安装bash,也可指定raw模块使用bash执行,此时可保留source语法:
    - name: "START ADP SERVICES"
      raw: "source ~/.profile; nohup sh /web/external_products/springboot/{{ vars[ environ + '_folder'] }}/veladpservice/bin/start.sh veladpservice.jar {{ vars[ environ + '_folder'] }} {{ allpass }} > /var/tmp/veladpservice_start.log 2>&1 &"
      args:
        executable: /bin/bash
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:45:03