我如何在 bash 中运行命令来杀死除调用的脚本test.py
和grep
pid 本身之外的所有 python 脚本,以防我们使用类似的东西ps -ef |grep
我想我可以使用 pgrep python 之类的东西来忽略 grep 进程,但是如何排除 test.py 脚本?我知道有一个选项可以做grep -v
,有没有选项可以做pgrep -v
澄清:除了 grep 进程 - 意味着当我们这样做时,ps -ef |grep test1.py
我们还会得到用于带来此结果的 grep pid。我不想杀死它,因为这个过程在显示结果的阶段不再存在。
答案1
您可以使用以下内容:
pkill $(pgrep python | grep -xv $(pgrep test.py))
从内到外的工作,是这样的:
- 收集 test.py 的 PID
pgrep test.py
- 将该 PID 发送到将
grep -xv
其从收集的列表中排除的位置(-v
该-x
选项表示匹配整行 (PID)): pgrep python
收集你想要杀死的 python 脚本列表
您可能需要调整 pgrep 才能准确找到您想要的 python 进程,但这就是基本结构。通过从内到外再次工作来调整它以适应您的情况:
运行
pgrep test.py
以确保它准确地找到您期望的 PID。查看pgrep -f
匹配完整进程名称的选项以更加确定。运行
pgrep python
(或类似)来查找您想要杀死的“python 脚本”。把它们放在一起!
答案2
使用ps
with的一般提示grep
,通常情况下您不希望grep
命令行匹配:
ps -ef | grep '[t]est'
test
将在命令行中匹配,但test
其本身不会出现在grep
命令行中。
获取 PID
ps -eo pid,comm | awk 'NF==2 && $2~"\\.py$" && $2!="test.py" { printf "%d ",$1; }'
我刚刚意识到这仅适用于最多 16 个字符的文件名。