如何杀死zsh中的所有后台进程?

时间:2012-10-31 19:58:20

标签: linux background zsh jobs

如标题所示 - 如何杀死zsh中的所有后台进程?

5 个答案:

答案 0 :(得分:11)

alias killbg='kill ${${(v)jobstates##*:*:}%=*}'

。它是zsh,不需要外部工具。

如果你想杀死工作号码N:

function killjob()
{
    emulate -L zsh
    for jobnum in $@ ; do
        kill ${${jobstates[$jobnum]##*:*:}%=*}
    done
}
killjob N

答案 1 :(得分:5)

应该使用builtin zsh内置命令以及另一个kill zsh内置命令:

builtin kill %1

由于kill也是位于/usr/bin/kill的{​​{3}}包(util-linuxupstream)中的单独二进制文件 不支持作业kill: cannot find process "%1")。

使用关键字builtin来避免名称冲突,或者mirror内置kill如果已禁用。

在shell中有一个禁用和启用内置命令(即shell自己的命令,如cdkill)的概念,在enable中你可以启用(a已禁用)kill内置为:

enable kill

问题disable检查内置是否已停用(并enable查看已启用的内容)。

答案 2 :(得分:1)

对@ Zxy的回复进行微调...

在我的系统上,我发现使用默认的kill信号没有正确杀死暂停的作业。我必须将其实际更改为kill -KILL才能使suspended个后台作业正常死亡。

alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'

特别注意周围的单一报价。如果您切换到双引号,则需要转义每个“$”。请注意,您不能使用function来包装此命令,因为该函数将递增$jobstates数组,从而导致函数尝试自杀...必须使用别名。

上面的killjob脚本有点多余,因为您可以这样做:

kill %1

点击次数少,而且已经构建到zsh

答案 3 :(得分:0)

alias killbg='for job in \`jobs -l | egrep -o "([0-9][0-9]+)"`; 

答案 4 :(得分:0)

这适用于ZSH和Bash:

: '
killjobs - Run kill on all jobs in a Bash or ZSH shell, allowing one to optionally pass in kill parameters

Usage: killjobs [zsh-kill-options | bash-kill-options]

With no options, it sends `SIGTERM` to all jobs.
'
killjobs () {

    local kill_list="$(jobs)"
    if [ -n "$kill_list" ]; then
        # this runs the shell builtin kill, not unix kill, otherwise jobspecs cannot be killed
        # the `$@` list must not be quoted to allow one to pass any number parameters into the kill
        # the kill list must not be quoted to allow the shell builtin kill to recognise them as jobspec parameters
        kill $@ $(sed --regexp-extended --quiet 's/\[([[:digit:]]+)\].*/%\1/gp' <<< "$kill_list" | tr '\n' ' ')
    else
        return 0
    fi

}

@zyx回答对我不起作用。

更多相关信息:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4