我有一个 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