如何仅获取进程的父PID,并排除使用grep链接到它的子进程

如何仅获取进程的父PID,并排除使用grep链接到它的子进程,grep,ansible,pid,ps,Grep,Ansible,Pid,Ps,我正在写一本ansible的剧本,这本剧本将杀死PIDs 我找到了一个与我相关的好答案: 但是,第一步是运行进程,在我的例子中,我有两个进程,如下所示: # when i do: ps -ef | grep appp.py ubuntu 17765 1 2 12:14 pts/0 00:00:04 python appp.py ubuntu 17784 17765 4 12:15 pts/0 00:00:05 /home/ubuntu/venvs/myvnv/

我正在写一本ansible的剧本,这本剧本将杀死PIDs

我找到了一个与我相关的好答案:

但是,第一步是
运行进程
,在我的例子中,我有两个进程,如下所示:

# when i do: ps -ef | grep appp.py

ubuntu   17765     1  2 12:14 pts/0    00:00:04 python appp.py 
ubuntu   17784 17765  4 12:15 pts/0    00:00:05 /home/ubuntu/venvs/myvnv/bin/python /home/ubuntu/deploy/appp.py 
ubuntu   17844 14784  0 12:17 pts/0    00:00:00 grep --color=auto appp.py
它杀死
17765
,然后失败:

failed: [10.10.1.1] (item=17784) => {"ansible_loop_var": "item", "changed": true, "cmd": "kill 17784", "delta": "0:00:00.002196", "end": "2020-04-26 12:23:22.833284", "item": "17784", "msg": "non-zero return code", "rc": 1, "start": "2020-04-26 12:23:22.831088", "stderr": "/bin/sh: 1: kill: No such process", "stderr_lines": ["/bin/sh: 1: kill: No such process"], "stdout": "", "stdout_lines": []}
意思是。。。它找不到要杀死的
17784

问题是:如何只获取带有ps grep的父PID(17784),然后将其传递给kill

把这件事做完 |grep-v grep

Tac将此结束
|grep-v grep

也许只是让你的python应用程序在某个地方编写一个pid并使用它,而不是尝试使用
ps
grep
来查找它。或者编写一个systemd单元来运行python应用程序,这样您就可以使用
systemctl stop…
来停止它。猜猜看。。。。如果您解决了第一个问题,它将在下一个pid 17844上再次出错,该pid 17844对应于您正在运行的当前grep命令,该命令不再存在。我建议您回到第一个链接的问题,阅读解决问题的第二个答案=>使用
pkill
而不是
grep+kill
。您可以先使用
pgrep
测试表达式。同时,最好的解决方案是遵循上面的@larsks注释。也许只是让你的python应用程序在某个地方编写一个pid并使用它,而不是尝试使用
ps
grep
来查找它。或者编写一个systemd单元来运行python应用程序,这样您就可以使用
systemctl stop…
来停止它。猜猜看。。。。如果您解决了第一个问题,它将在下一个pid 17844上再次出错,该pid 17844对应于您正在运行的当前grep命令,该命令不再存在。我建议您回到第一个链接的问题,阅读解决问题的第二个答案=>使用
pkill
而不是
grep+kill
。您可以先使用
pgrep
测试表达式。同时,最好的解决方案是遵循上面的@larsks评论。