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

cuxqih21  于 2022-12-18  发布在  Linux
关注(0)|答案(5)|浏览(260)

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

ncgqoxb0

ncgqoxb01#

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

.它是zsh,不需要外部工具。
如果要终止作业号N:

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

dfty9e192#

应该将builtin zsh内置命令与另一个kill zsh内置命令一起使用,如下所示:

builtin kill %1

因为kill也是来自/usr/bin/killutil-linux包(upstreammirror)的单独二进制文件,该包不支持作业kill: cannot find process "%1")。
使用关键字builtin以避免名称冲突或enablekill内置如果它被禁用.
在shell中有一个禁用和启用内置命令(即shell自己的命令,如cdkill)的概念,在zsh中,您可以启用(禁用)kill内置命令,如下所示:

enable kill

执行disable检查内置是否已禁用(执行enable查看已启用的内置)。

ujv3wf0j

ujv3wf0j3#

对@Zxy的响应进行了细微调整...
在我的系统上,我发现挂起的作业不能用默认的kill信号正确地终止,我不得不将其改为kill -KILL,以使suspended后台作业正确地终止。

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

请特别注意这周围的单引号。如果您切换到双引号,您将需要转义每个“$"。注意,您不能使用function来 Package 这个命令,因为函数将递增$jobstates数组,导致函数试图杀死自己...必须使用别名。
上面的killjob脚本有点多余,因为您可以执行以下操作:

kill %1

更少的击键次数,而且它已经内置到zsh中。

xfb7svmp

xfb7svmp4#

这对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

gwbalxhn

gwbalxhn5#

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

相关问题