使用bash和regex在一行中查找并终止进程

Orj*_*anp 595 regex bash terminal awk

我经常需要在编程期间杀死进程.

我现在这样做的方式是:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124
Run Code Online (Sandbox Code Playgroud)

如何自动提取进程ID并在同一行中终止它?

像这样:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 1310

bash,你应该能够做到:

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)

有关其运作的详情如下:

  • ps为您提供了所有进程的列表.
  • grep基于搜索字符串的过滤器[p]是一种阻止您自己获取实际grep过程的技巧.
  • awk只是给你的每一行,这是PID的第二场.
  • $(x)构建体是指以执行x再取它的输出,并把它在命令行上.ps上面那个构造中的那个管道的输出是进程ID列表,所以你最终会得到一个命令kill 1234 1122 7654.

这是一个显示它在行动的成绩单:

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600
Run Code Online (Sandbox Code Playgroud)

你可以看到它终止了所有的睡眠者.


grep '[p]ython csp_build.py'更详细地解释一下这个位:

当你sleep 3600 &接着跟随时ps -ef | grep sleep,你倾向于得到两个进程sleep,其中sleep 3600grep sleep(因为它们都包含sleep在其中,这不是火箭科学).

但是,ps -ef | grep '[s]leep'不会sleep在其中创建一个进程,而是创建grep '[s]leep'并且这里是棘手的一点:grep找不到它,因为它正在查找正则表达式"字符类中的任何字符[s](s后面跟着)leep.

换句话说,它正在寻找,sleep但grep进程是grep '[s]leep'没有的sleep.

当我看到这个(由某人在这里)时,我立即开始使用它,因为

  • 它比添加少一个过程| grep -v grep; 和
  • 这是优雅鬼鬼祟祟,罕见的组合:-)

  • 你可能只使用awk - **ps aux | awk'/ [b] eam/{print $ 2}'**,不需要**grep** (56认同)
  • 最好只使用pgrep或pkill (18认同)
  • 您也可以使用:`kill $(ps aux | grep'python csp_build.py'| grep -v grep | awk'{print $ 2}')`而不是`grep'[p] ython csp_build.py'.`grep -v`返回不匹配的行. (3认同)
  • @paxdiablo,你能提供一个链接吗?我很困惑为什么它有效. (2认同)

gho*_*g74 128

如果你有pkill,

pkill -f csp_build.py
Run Code Online (Sandbox Code Playgroud)

如果您只想对进程名称(而不是完整的参数列表)进行grep,请不要使用-f.

  • +1.只要你注意正确指定过程,`pgrep`和`pkill`就可以工作.默认情况下,只匹配*进程名*,在这种情况下几乎肯定只是"python".使用`pgrep -f"python csp_build.py"`匹配完整命令. (17认同)
  • 首先使用pgrep来验证你是否已经使用了正确的进程.然后在正确的模式上再次使用pkill. (7认同)
  • 您可能需要使用`pkill -9 -f csp_build.py`强制执行终止操作。 (2认同)

a20*_*a20 83

一个班轮:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
Run Code Online (Sandbox Code Playgroud)
  • 打印第2栏: ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9
  • awk '{print $2}' 是可选的
  • 运行sudo,kill -9 5124等等(杀-15更优美,但稍慢)

奖金:

我还有.bash_profile中定义的2个快捷方式函数(〜/ .bash_profile用于osx,你必须看看哪些适用于你的*nix机器).

  1. p 关键字
    • 列出包含关键字的所有P rocesses
    • 使用如:kill -9 5373,p csp_build

bash_profile代码:

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}
Run Code Online (Sandbox Code Playgroud)
  1. ka 关键字
    • ķ顽疾一个具有此关键字LL工艺
    • 使用如:p python,ka csp_build
    • 可选的死亡水平如:ka python,ka csp_build 15

bash_profile代码:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
Run Code Online (Sandbox Code Playgroud)


Rah*_*hul 14

尝试使用

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
Run Code Online (Sandbox Code Playgroud)

  • `ps aux | grep'python csp_build.py'| awk'{print $ 2}'| xargs kill`为我工作.感谢名单 (2认同)

小智 14

killall -r regexp

-r, --regexp
Run Code Online (Sandbox Code Playgroud)

将进程名称模式解释为扩展正则表达式.


NGi*_*Gix 9

您只能pkill '^python*'用于正则表达式进程查杀.

如果你想在杀戮之前看到你要杀死或找到的东西,只需使用pgrep -l '^python*'-l输出也是进程的名称.如果您不想使用 pkill,请使用:

pgrep '^python*' | xargs kill


avi*_*amg 8

解决方案是使用精确的模式过滤进程,解析 pid,并构建用于执行终止进程的参数列表:

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9
Run Code Online (Sandbox Code Playgroud)

文档的解释

ps实用程序显示标题行,后面的行包含有关具有控制终端的所有进程的信息。

-e显示有关其他用户进程的信息,包括那些

-f显示uid、pid、父pid、最近CPU使用率、进程启动情况

grep实用程序搜索任何给定的输入文件,选择符合以下条件的行

-e pattern, --regexp=pattern 指定在输入搜索期间使用的模式:如果输入行与任何指定模式匹配,则选择该输入行。当使用多个 -e 选项指定多个模式或模式以短划线 (`-') 开头时,此选项最有用。

xargs - 构造参数列表并执行实用程序

Kill - 终止或向进程发出信号

9号信号 - KILL(不可捕获、不可忽略的杀戮)

例子

ps -ef  | grep -e node -e loggerUploadService.sh -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9
Run Code Online (Sandbox Code Playgroud)


小智 7

使用pgrep - 在许多平台上都可用:

kill -9 `pgrep -f cps_build`
Run Code Online (Sandbox Code Playgroud)

pgrep -f将返回所有PID重合"cps_build"

  • 如果你有'pgrep`,你也会有'pkill`.一如既往,[不要使用`kill -9`](http://www.iki.fi/era/unix/award.html#kill),除非你知道为什么`kill -15`(默认)或`杀-2`将无法正常工作. (2认同)

Rak*_*iha 6

这只会返回pid

pgrep -f 'process_name'
Run Code Online (Sandbox Code Playgroud)

因此,要在一行中杀死任何进程:

kill -9 $(pgrep -f 'process_name')
Run Code Online (Sandbox Code Playgroud)

或者,如果您知道进程的确切名称,也可以尝试使用pidof:

kill -9 $(pidof 'process_name')
Run Code Online (Sandbox Code Playgroud)

但是,如果您不知道该进程的确切名称,pgrep那就更好了。

如果有多个运行相同名称的进程,并且您想杀死第一个进程,则:

kill -9 $(pgrep -f 'process_name' | head -1)
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您担心区分大小写,则可以像在grep中一样添加-i选项。例如:

kill -9 $(pgrep -fi chrome)
Run Code Online (Sandbox Code Playgroud)

有关信号,并在p纤ep更多信息man 7 signalman signalman pgrep


Nei*_*nby 6

这里有很多好的答案 - 我使用了OP接受的答案。pkill只是添加一个关于和 的小警告pgrep。正如您可能从其手册页中看到的那样,在您的操作系统上,某些操作系统对进程名称有 15 个字符的限制。该-f选项在我的操作系统上绕过了这个问题,但在找到该选项之前我遇到了麻烦!


Ale*_*äll 5

你可以用awk和backtics做到这一点

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`
Run Code Online (Sandbox Code Playgroud)

awk中的$ 2打印第2列,而backtics运行打印的语句.

但是一个更清晰的解决方案是让python进程在/ var/run中存储它的进程id,然后你可以简单地读取该文件并将其杀死.


Ser*_*rge 5

我的任务是杀死所有放置在特定目录中的与regexp匹配的东西(在硒测试后,一切不会停止)。这为我工作:

for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done
Run Code Online (Sandbox Code Playgroud)


小智 5

要按关键字终止进程midori,例如:

kill -SIGTERM $(pgrep -i midori)