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

如何将Ansible的stdout_lines输出存储到字典并提取PID与进程名?

提取进程PID与名称并存储为字典

你可以通过Jinja2模板遍历stdout_lines的每行输出,拆分字符串后构建字典,实现PID与进程信息的映射。

完整Ansible任务示例

- name: Get all running processes
  shell:
    cmd: pgrep -a run.sh
  register: _get_pid_and_name

- name: Convert process output to dictionary
  set_fact:
    process_dict: >-
      {% set output_dict = {} %}
      {% for line in _get_pid_and_name.stdout_lines %}
        {% set split_line = line.split(maxsplit=1) %}
        {% do output_dict.update({split_line[0]: split_line[1]}) %}
      {% endfor %}
      {{ output_dict }}

- name: Print process dictionary
  debug:
    var: process_dict

代码说明

  • stdout_lines:自动将命令输出按行分割为列表,无需手动处理换行符
  • split(maxsplit=1):把每行内容拆分为两部分,第一部分是PID(数字字符串),第二部分是完整的进程命令行
  • Jinja2循环:遍历每行输出,将PID作为字典的键,进程命令作为对应的值,最终生成字典

预期输出

"process_dict": {
    "1234223": "/bin/ksh ./run.sh -f -i 1",
    "4356223": "/bin/ksh ./run.sh -f -i 2",
    "887455": "/bin/ksh ./run.sh -f -i 3",
    "9934534": "/bin/ksh ./run.sh -f -i 4",
    "3245764": "/bin/ksh ./run.sh -f -i 5"
}

提取纯进程名称(可选)

如果只需要提取./run.sh这类进程名称而非完整命令,可以调整拆分逻辑:

- name: Convert to dictionary with only process name
  set_fact:
    process_name_dict: >-
      {% set output_dict = {} %}
      {% for line in _get_pid_and_name.stdout_lines %}
        {% set split_line = line.split(maxsplit=1) %}
        {% set pid = split_line[0] %}
        {% set process_name = split_line[1].split()[1] %}  # 提取命令中的第二个字段
        {% do output_dict.update({pid: process_name}) %}
      {% endfor %}
      {{ output_dict }}

对应的输出会变成:

"process_name_dict": {
    "1234223": "./run.sh",
    "4356223": "./run.sh",
    "887455": "./run.sh",
    "9934534": "./run.sh",
    "3245764": "./run.sh"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:07:02