通过部分名称匹配终止进程的Bash脚本

通过部分名称匹配终止进程的Bash脚本,bash,Bash,我有一个非常小的脚本,名为processKiller,它在运行中的服务上,在给定部分名称匹配的情况下终止一个进程 现在,我的剧本是: ARG=$1 sudo pkill -f $ARG -9 这是有效的。它只打印被杀死的,不管它是否杀死了什么东西。但是,如果能够找到部分匹配的进程,我希望能够为用户的输入设置一个var。假设我有一个名为MyProcess-01-02的进程,用户在命令行中键入: processKiller.sh MyPro 我希望它能够输出: 终止日期:MyProcess-01-

我有一个非常小的脚本,名为
processKiller
,它在运行中的服务上,在给定部分名称匹配的情况下终止一个进程

现在,我的剧本是:

ARG=$1
sudo pkill -f $ARG -9
这是有效的。它只打印被杀死的,不管它是否杀死了什么东西。但是,如果能够找到部分匹配的进程,我希望能够为用户的输入设置一个var。假设我有一个名为
MyProcess-01-02
的进程,用户在命令行中键入:

processKiller.sh MyPro

我希望它能够输出:

终止日期:MyProcess-01-02

我想到了类似的事情,但它没有正确设置变量。有什么想法吗

ARG=$1
SERVICE = -f $ARG
sudo pkill -f $SERVICE -9
echo "Killed: $SERVICE"

此外,一旦发现服务变量只有在它确实已经运行时才会终止,是否有任何方法可以对其运行“如果”检查?

一种可能的方法可以如下所示:

#!/bin/bash

#get the argument
processNameToFind="$1"

#find any process lines with that name
processLines=$(ps o pid,command | grep "$processNameToFind" | grep -v "$0" | grep -v "grep")

#let's see if we found something
if [ -n "$processLines" ]
then
    #we may have found multiple processes running
    while read -r pid processName
    do 
        #kill it        
        sudo kill -9 "$pid"
        echo "Killed: $processName"
    done <<< "$processLines"
else
    echo "No process was found with the name: $processNameToFind"
fi
#/bin/bash
#明白了吗
processNameToFind=“$1”
#查找具有该名称的任何流程线
processLines=$(ps o pid,命令| grep“$processNameToFind”| grep-v“$0”| grep-v“grep”)
#让我们看看有没有发现什么
如果[-n“$processLines”]
然后
#我们可能发现多个进程正在运行
读取时-r pid processName
做
#杀了它
sudo kill-9“$pid”
echo“Killed:$processName”

完成您可以使用
pkill
-e
选项来显示被杀死的对象:

pattern=$1
pkill -e -9 "$pattern"  # Remember to quote your arguments
例如:

pkill -e xyz
xyz killed (pid 8105)
xyz killed (pid 8109)
xyz killed (pid 8110)
xyz killed (pid 8111)
xyz killed (pid 8112)
xyz killed (pid 8113)
xyz killed (pid 8114)
xyz killed (pid 8115)
xyz killed (pid 8116)
如果您不喜欢此输出格式,可以使用
sed

pkill -e -9 "$pattern" | sed -re 's/^(\S+).*/Killed: \1/'

别忘了他想使用一个脚本,他要找的名字也将是脚本的一个参数,因此这将:1)杀死脚本本身,这样你就不能在那一行之后添加命令,以防你想添加;2) 总是杀掉一些东西(剧本本身),即使他正在寻找的不是他想要的all@JoãoMiranda:我不明白为什么这会扼杀脚本本身。好吧,他会用“processKiller.sh MyPro”来调用脚本。当您运行“pkill-e-f-9”$PATTERN”时,他的脚本也将出现在pkill将要杀死的进程列表中,因为“processKiller.sh MyPro”将出现在进程列表中,并且它也将匹配该模式。这只是因为他将使用模式作为脚本的参数。哦,对了,这是因为
-f
。我(通过阅读问题)删除了它,因为我认为没有必要。谢谢你指出!在教学资源中显示所有caps变量名称并不理想——请参阅相关POSIX规范第四段,为对系统或shell有意义的变量指定所有caps名称,并为应用程序保留至少一个小写变量的命名空间。为什么要使用
awk
进行后处理?shell可以为您拆分一些内容:
whileread-rpid processName;do…
将具有相同的效果(第一列到
pid
,其余所有列到
processName
)。这非常接近,但似乎它没有捕获部分匹配的所有内容。它使用部分匹配的名称杀死了一个东西,但在运行
ps-ef
命令时,我看到的另一个东西没有被列出。例如,在
cmd
列下,我有一个进程名为:`sudo-u application\u user MyProcess-01-02-`它杀死了这个进程。然而,我有另一个名为
/bin/java-cp/opt/MyProcess-01-02-SNAPSHOT/lib
,这个仍然运行着Consider,它养成了在这里提问之前先运行代码的习惯。