【问题标题】:How to kill a running process using ansible?如何使用ansible杀死正在运行的进程?
【发布时间】:2017-10-01 18:48:02
【问题描述】:

我有一个 ansible playbook 可以杀死正在运行的进程并且大部分时间都很好用!但是,有时我们会发现无法杀死的进程,所以“wait_for”会超时,抛出错误它停止了这个过程。

当前的解决方法是手动进入该框,使用“kill -9”并再次运行 ansible playbook,所以我想知道是否有任何方法可以从 ansible 本身处理这种情况?我的意思是,我没有不想从一开始就使用 kill -9 但我可能是一种处理超时的方法?甚至只有在进程没​​有在 300 秒内被杀死的情况下才使用 kill -9?但是最好的方法是什么?

这些是我目前的任务:

- name: Get running processes
  shell: "ps -ef | grep -v grep | grep -w {{ PROCESS }} | awk '{print $2}'"
  register: running_processes

- name: Kill running processes
  shell: "kill {{ item }}"
  with_items: "{{ running_processes.stdout_lines }}"

- name: Waiting until all running processes are killed
  wait_for:
    path: "/proc/{{ item }}/status"
    state: absent
  with_items: "{{ running_processes.stdout_lines }}"

谢谢!

【问题讨论】:

  • 仅在需要外壳功能时才使用外壳。命令:“杀死 {{ item }}”

标签: process ansible kill ansible-2.x kill-process


【解决方案1】:

您可以忽略wait_for 上的错误并注册结果以强制杀死失败的项目:

- name: Get running processes
  shell: "ps -ef | grep -v grep | grep -w {{ PROCESS }} | awk '{print $2}'"
  register: running_processes

- name: Kill running processes
  shell: "kill {{ item }}"
  with_items: "{{ running_processes.stdout_lines }}"

- wait_for:
    path: "/proc/{{ item }}/status"
    state: absent
  with_items: "{{ running_processes.stdout_lines }}"
  ignore_errors: yes
  register: killed_processes

- name: Force kill stuck processes
  shell: "kill -9 {{ item }}"
  with_items: "{{ killed_processes.results | select('failed') | map(attribute='item') | list }}"

【讨论】:

  • 我可以在博文中使用它吗? (带有返回此回复的链接)@Eric
  • 顺便说一句,这将等待每个进程 {{timeout}} 秒,因此 5 个进程将导致 5*{{timeout}}。我想知道这是否可以通过异步改进..
  • 你能解释一下"{{ killed_processes.results | select('failed') | map(attribute='item') | list }}"吗?我是 Ansible 的新手,我正在寻找一组可以可靠地终止一组进程的任务。
【解决方案2】:

killall 命令有一个可能有用的等待选项。

安装 psmisc:

tasks:
  - apt: pkg=psmisc state=present

然后像这样使用killall:

tasks:
  - shell: "killall screen --wait"
    ignore_errors: true # In case there is no process

-w, --wait: 等待所有被杀死的进程死亡。 killall 每秒检查一次是否有任何被杀死的进程仍然存在,只有在没有留下时才返回。

【讨论】:

  • 与其他答案相比如此优雅!
【解决方案3】:

使用pkill(1) 代替grep+kill

【讨论】:

    【解决方案4】:

    经过一些调查和ansible_linter 的斗争,下面是另一种方式(例如,不使用ignore_error

    - name: "disable and stop PROCESS"
      service:
        name: PROCESS
        enabled: no
        state: stopped
      tags:
        - stop
    
    - name: "evaluate running PROCESS processes from remote host"
      command: "/usr/bin/pgrep PROCESS"
      register: running_PROCESS
      failed_when: running_PROCESS.rc > 1
      changed_when: 
        - running_PROCESS.rc == 0
      tags:
        - stop
    
    - name: "pkill PROCESS running processes"
      command: "/usr/bin/pkill PROCESS"
      register: kill_PROCESS
      changed_when: kill_PROCESS.rc == 0
      when: running_PROCESS.stdout_lines | length > 0
      tags:
        - stop
    
    - name: "check PROCESS processes"
      wait_for:
        path: "/proc/{{ item }}/status"
        state: absent
      with_items: "{{ running_PROCESS.stdout_lines }}"
      when: running_PROCESS.stdout_lines | length > 0
      tags:
        - stop
    
    - name: "force kill stuck PROCESS processes"
      command: "/usr/bin/pkill -9 PROCESS"
      register: kill9_PROCESS
      changed_when: kill9_PROCESS.rc == 0
      failed_when: kill9_PROCESS.rc > 1
      when:
        - running_PROCESS.stdout_lines | length > 0
      tags:
        - stop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 2020-03-20
      • 2013-11-01
      • 1970-01-01
      • 2018-12-10
      相关资源
      最近更新 更多