如何用Ansible终止进程?代码报错求助
问题排查与修正
核心错误原因
你这段代码的致命错误在Kill the process任务的shell命令写法:
shell: "{{ kill item }}"
Ansible模板语法里,{{ ... }}是用来解析变量的,你把整个kill item塞进去,Ansible会把它当成一个模板表达式来解析,自然会报语法错误。正确的写法是把命令和变量分开,变量部分用模板包裹:
shell: "kill {{ item }}"
额外优化点
原代码里的ps -few | grep httpd会把执行grep的进程也列出来,导致后续kill命令可能报错(因为进程已经不存在),可以修改ps命令来避免这个问题:
shell: "ps -few | grep [h]ttpd | awk '{print $2}'"
用[h]ttpd的正则写法,grep自身进程的命令行是grep [h]ttpd,不会被grep [h]ttpd匹配到,这样就能准确拿到httpd的进程ID。
修正后的完整代码
- name: Kill a process hosts: all tasks: - name: Get running process ignore_errors: yes shell: "ps -few | grep [h]ttpd | awk '{print $2}'" register: running_process - name: Kill the process ignore_errors: yes shell: "kill {{ item }}" with_items: "{{ running_process.stdout_lines }}"
可选改进
如果需要强制杀死进程,可以把kill命令改成kill -9 {{ item }};另外,也可以用Ansible自带的service模块来管理httpd服务,比手动杀进程更规范:
- name: Stop httpd service service: name: httpd state: stopped
内容的提问来源于stack exchange,提问作者user3183111
相关产品推荐
相关产品推荐

