我经常需要在编程期间终止一个进程。

我现在的做法是:

[~]$ 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

如何自动提取进程id并在同一行中杀死它?

是这样的:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>

当前回答

一个衬套:

Ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9

打印列2:awk '{Print $2}' Sudo是可选的 运行kill -9 5124, kill -9 5373等(kill -15更优雅,但稍慢)


奖金:

我还在.bash_profile中定义了2个快捷函数 (~ /。Bash_profile是用于osx的,你必须看看什么适用于你的*nix机器)。

p关键字 列出所有包含关键字的进程 用法例如:p csp_build, p python等

bash_profile代码:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}

ka关键字 杀死所有具有此关键字的进程 用法例如:ka csp_build, ka python等 可选的kill级别,例如:ka csp_build 15, ka python 9

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"
}

其他回答

试着用

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill

从一个普通的PPID开始杀死我们自己的进程是相当频繁的,pkill与-P标志相关联对我来说是一个赢家。以@ghostdog74为例:

# sleep 30 &                                                                                                      
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$                                                                                                         
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30

在bash中,只使用问题(1)中列出的基本工具,你应该能够做到:

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

其工作详情如下:

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

你可以看到它终止了所有的休眠。

更详细地解释一下grep '[p]ython csp_build.py'位:当您执行sleep 3600并且后面跟着ps -ef | grep sleep时,您往往会得到两个包含sleep的进程,sleep 3600和grep sleep(因为它们都包含sleep,这不是火箭科学)。

然而,ps -ef | grep '[s]leep'不会创建一个包含sleep的grep进程,而是使用命令grep '[s]leep'创建一个grep进程,这里有一个棘手的地方:grep不会找到这个进程,因为它正在寻找正则表达式“字符类[s](基本上就是s)中的任何字符后跟leep”。

换句话说,它在寻找sleep但是grep进程是grep '[s]leep'里面没有sleep文本。

当我看到这个(有人在这里的SO),我立即开始使用它,因为

它比添加| grep -v grep少了一个进程;而且 这是优雅而狡猾的,一个罕见的组合:-)


(1)如果你不局限于使用这些基本工具,有一个漂亮的pgrep命令,它可以根据特定的标准查找进程(当然,假设你的系统上有这个命令)。

例如,您可以使用pgrep sleep来输出所有sleep命令的进程id(默认情况下,它与进程名匹配)。如果你想匹配ps中显示的整个命令行,你可以执行类似pgrep -f 'sleep 9999'这样的操作。

顺便说一句,如果执行pgrep,它不会列出自己,因此在这种情况下不需要上面所示的棘手的筛选方法。

通过使用-a显示完整的进程名,可以检查这些进程是否是您感兴趣的进程。您还可以使用-u或-u将范围限制为您自己的进程(或特定的用户集)。有关更多选项,请参阅pgrep/pkill的手册页。

一旦你满意了,它将只显示你感兴趣的进程,然后你可以使用pkill和相同的参数向所有这些进程发送信号。

通过关键字midori终止进程,例如:

kill sigterm $(pgrep -i midori)

一个衬套:

Ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9

打印列2:awk '{Print $2}' Sudo是可选的 运行kill -9 5124, kill -9 5373等(kill -15更优雅,但稍慢)


奖金:

我还在.bash_profile中定义了2个快捷函数 (~ /。Bash_profile是用于osx的,你必须看看什么适用于你的*nix机器)。

p关键字 列出所有包含关键字的进程 用法例如:p csp_build, p python等

bash_profile代码:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}

ka关键字 杀死所有具有此关键字的进程 用法例如:ka csp_build, ka python等 可选的kill级别,例如:ka csp_build 15, ka python 9

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"
}