15

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

4

5 回答 5

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

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

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

function killjob()
{
    emulate -L zsh
    for jobnum in $@ ; do
        kill ${${jobstates[$jobnum]##*:*:}%=*}
    done
}
killjob N
于 2012-10-31T20:52:16.253 回答
7

应该将builtinzsh 内置命令与其他killzsh 内置命令一起使用:

builtin kill %1

askill也是一个独立的二进制文件,来自不支持作业( ) 的util-linux包(上游镜像)。/usr/bin/killkill: cannot find process "%1"

使用关键字builtin来避免名称冲突或内置(如果它被禁用)enablekill


在 shell 中有一个禁用和启用内置命令(即 shell 自己的命令,例如cdand kill)的概念,在中,您可以启用(禁用的)kill内置命令:

enable kill

disable检查内置是否被禁用(并enable查看启用的)的问题。

于 2017-08-08T16:08:16.580 回答
2

对@Zxy 的回复稍作调整……

在我的系统上,我发现挂起的作业没有被默认的终止信号正确终止。我实际上必须将其更改kill -KILL为让suspended后台工作正常结束。

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

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

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

kill %1

更少的击键,它已经内置到zsh.

于 2016-12-08T12:51:01.450 回答
1

这适用于 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

于 2016-04-01T10:53:57.537 回答
0
alias killbg='for job in \`jobs -l | egrep -o "([0-9][0-9]+)"`; 
于 2012-10-31T19:58:48.363 回答