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

我现在的做法是:

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

当前回答

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

kill sigterm $(pgrep -i midori)

其他回答

我不喜欢纯粹基于grep的盲目结果而杀死东西——如果我错误地匹配了超出期望的结果怎么办?

我知道这可能会遭到命令行纯粹主义者的反对,但对于这种情况,我更喜欢使用交互式过滤器,比如pick (apt-get install pick)。使用这种工具,过滤后的结果会在你输入的时候显示出来,这样你就可以清楚地看到当你按回车键时什么会被杀死。

这样,一行代码就变成了

function killpick { ps ax | pick -q "$1" | awk  '{print $1}' | xargs kill -9; }

Killpick本身提供了一个带有增量过滤的选择器,可选参数为过滤器提供了一个起始字符串。

试着用

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

使用-C ps命令的标志

- c cmdlist 按命令名选择。它选择的进程 可执行文件名称在cmdlist中给出。

第一个例子,简单的命令

所以如果你用标准shebang运行你的脚本,并调用他们的名字:

/path/to/csp_build.py

你可能会找到他们

ps -C csp_build.py

So

kill $(ps -C csp_build.py ho pid)

也许足够了。

第二种情况,搜索CMD

更强烈一点,但仍然比这个SO问题的大多数其他答案快得多…

如果你不知道这是谁,或者你只是匆匆走过

python csp_build.py
python3 csp_build.py
python /path/to/csp_build.py

你可以通过以下方式找到它们:

ps -C python,python3,csp_build.py who pid,cmd | grep csp_build.py

然后使用sed:

kill $(ps -C python,python3,csp_build.py who pid,cmd |
    sed -ne '/csp_build.py/s/^ *\([0-9]\+\) .*$/\1/p')

如果pkill -f csp_build.py没有杀死进程,你可以添加-9来发送一个杀死信号,该信号不会被忽略。即pkill -9 -f csp_build.py

一个衬套:

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