我正在使用 bash 启动一个 python 程序的多个实例,如下所示:
python example.py -id $i
其中$i
是赋予实例的 id。所有进程都在同一用户上启动,想象一下我无法跟踪进程 ID。是否可以仅通过调用它的命令(带有 id)来杀死特定实例?例如,类似的东西pkill 'python example.py -id 2'
显然不起作用。
答案1
使用pkill -fx
:
pkill -fx 'python example.py -id 2'
该-f
选项使pkill
匹配发生在完整的命令行上,而不仅仅是进程名称,并-x
强制模式完全匹配完整的命令,而不仅仅是它的任何子字符串(就像grep -x
)。您需要-x
避免匹配末尾可能有更多数字的命令行,例如20
or 203
。
答案2
kill $(ps -ef | grep '[s]earch-string' | sed -re 's/[[:blank:]]+/\t/g' | cut -f2)
ps -ef
:获取带有参数的进程列表grep
:过滤您想要的记录,以[]
阻止 grep 找到它自己。sed -re 's/[[:blank:]]+/\t/g'
:将空格转换为单个制表符cut -f2
:提取pid字段
注意:
ps
不是很便携,有一个用于 posix,一个用于 bsd,一个用于 system-v。 Gnu 看起来试图与所有人兼容。