使用shell脚本通过进程名称杀死多个进程

使用shell脚本通过进程名称杀死多个进程

我有一个 shell 脚本,它将启动进程并终止进程。它接受进程名称作为参数。需要找到pid并杀死它们。

最初,就像

for procname in ${@};do
    pkill -f $procname
done

我不知道为什么,它没有杀死传递给它的所有进程。现在,我正在寻找这样的东西

for procname in ${@};do
  IFS=$"\n"; echo
    (ps auxw | awk -v proc="$procname" -v preserve="${0##*/}" \
       '$0 ~ proc && $0 !~ preserve && ! /awk/ { print $2}')
done

我正在尝试在上面的代码中打印 pid,但是我需要kill命令,如果它无需 for 循环也能工作,那么它应该很好

进程名称将包含.类似com.abc.def.pqr.xyz

答案1

pkill -f -- "$regex"杀死其 arg 列表(对于那些执行命令的进程,或具有执行命令的祖先的进程)与空格连接(与标准ps -f或 BSD报告的相同ps u)与给定扩展正则表达式(始终排除其自身)匹配的进程。

因此,您在这里需要的只是将位置参数与|

IFS='|'
pkill -f -- "$*"

要匹配进程名称而不是参数列表,请删除-f.但请注意,在 Linux 上,进程名称的长度限制为 15 个字节,因此不可能是com.abc.def.pqr.xyz.另请注意,这.是一个匹配任何单个字符的正则表达式运算符,因此要匹配包含该字符的进程参数列表(例如comXabcYdefZpqr+xyz),您需要一个com\.abc\.def\.pqr\.xyz正则表达式。

答案2

我很欣赏@Stéphane Chazelas 的回答。因为我从中获取此 shell 脚本的参数,并且它们是空格分隔的,并且它们在进程名称中JAVA包含字符。.我是这样想出来的..

temp=()
for procname in ${@}; do
    temp+=$(jps -ml | grep $procname | grep -v grep | awk '{print $1 " "}')
done
kill -9 $temp

相关内容