代码之家  ›  专栏  ›  技术社区  ›  Julio Fernandez

如何使用ansible终止正在运行的进程?

  •  22
  • Julio Fernandez  · 技术社区  · 7 年前

    我有一本ansible playbook,可以杀死正在运行的进程,并且在大多数情况下效果很好!,然而,我们有时会发现无法终止的进程,因此,“wait\u for”到达超时,抛出错误并停止进程。

    当前的解决方法是手动进入框,使用“kill-9”并再次运行ansible剧本,因此我想知道是否有任何方法可以从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 }}"
    

    4 回复  |  直到 7 年前
        1
  •  62
  •   Eric Citaire    7 年前

    您可以忽略上的错误 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 }}"
    
        2
  •  5
  •   Sean    4 年前

    使用 pkill (1) 而不是 grep kill .

        3
  •  4
  •   Tobias Ernst    4 年前

    这个 killall

    安装psmisc:

    tasks:
      - apt: pkg=psmisc state=present
    

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

    -w, --wait

        4
  •  0
  •   nean    3 年前

    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