Bash脚本通过部分名称匹配来杀死进程

时间:2018-01-18 21:24:30

标签: bash

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

现在,我有我的剧本:

ARG=$1
sudo pkill -f $ARG -9

这很有效。它只是打印killed,无论它是否会杀死。但是,如果能够找到具有部分匹配的进程,我希望能够将var设置为用户的输入。所以说我有一个名为MyProcess-01-02的进程,用户在他们的cmd行中键入:

  

processKiller.sh MyPro

我希望输出:

  

被杀:MyProcess-01-02

我想到了类似的东西,但它没有正确设置变量。有任何想法吗?

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

此外,如果发现只有在确实已经在运行的情况下才会发现对SERVICE变量进行“if”检查会有什么办法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用-e的{​​{1}}选项来显示被杀的内容:

pkill

示例:

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

答案 1 :(得分:0)

一种可能的方法是这样的:

#!/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

需要注意几点:

  • ps 中获取结果可能很棘手,结果可能因系统而异;你可能需要适应你的
  • pgrep 通常首选根据名称查找pid,但您不仅需要pid而且还需要名称;这就是为什么我们要贪图 ps
  • 的结果
  • 你想在脚本中使用它,并且你正在使用你要搜索的进程的名称作为脚本和grep的参数,所以我们将删除脚本的名称和grep来自 ps 结果
  • 假设如果你有多个进程在运行,你会想要杀死所有这些进程,而不仅仅是列表中的第一个,因此是
  • 我们没有检查 kill 命令的退出状态,我们只是打印我们杀了它,假设它成功了
  • 如果我们没有找到该过程,我们有其他的,但这是可选的,当然
  • 使用这种方法,您可以根据用于运行流程的整行(命令加参数)来终止进程。

编辑:更新了Charles Duffy的提示