首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash脚本,它通过部分名称匹配来终止进程

Bash脚本,它通过部分名称匹配来终止进程
EN

Stack Overflow用户
提问于 2018-01-18 21:24:30
回答 2查看 306关注 0票数 1

我有一个很小的脚本,名为processKiller,它杀死了在运行中的服务上给定部分名称匹配的进程。

现在,我的剧本是:

代码语言:javascript
复制
ARG=$1
sudo pkill -f $ARG -9

而且这个很管用。它只打印killed,不管它杀不杀什么东西。但是,我希望能够为用户的输入设置一个var,如果它能够找到一个具有部分匹配的进程。因此,假设我有一个名为MyProcess-01-02的进程,并在它们的cmd行中输入用户类型:

processKiller.sh MyPro

我希望它能输出:

被害: MyProcess-01-02

我想到了这样的事情,但它没有正确地设置变量。有什么想法吗?

代码语言:javascript
复制
ARG=$1
SERVICE = -f $ARG
sudo pkill -f $SERVICE -9
echo "Killed: $SERVICE"

此外,是否有任何方法来运行" if“检查服务变量,一旦发现只有当它确实已经在运行时才会终止它?

EN

回答 2

Stack Overflow用户

发布于 2018-01-21 13:35:17

您可以使用-e选项pkill来显示正在被杀死的是什么:

代码语言:javascript
复制
pattern=$1
pkill -e -9 "$pattern"  # Remember to quote your arguments

示例:

代码语言:javascript
复制
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更改它

代码语言:javascript
复制
pkill -e -9 "$pattern" | sed -re 's/^(\S+).*/Killed: \1/'
票数 2
EN

Stack Overflow用户

发布于 2018-01-21 13:30:53

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

代码语言:javascript
复制
#!/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的参数,因此我们将从ps结果中删除脚本的名称和grep。
  • 假设您有多个进程正在运行,您将希望杀死所有这些进程,而不仅仅是列表中的第一个进程,因此
  • 我们不是在检查杀死命令的退出状态,我们只是打印我们杀死了它,假设它是成功的
  • 我们还有其他的,以防我们找不到这个过程,但这当然是可选的。
  • 使用这种方法,您可以根据用于运行进程的整行(命令加参数)来终止进程。

编辑:用查尔斯·达菲的贴士更新

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48330543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档