GNU/Linux >> Znalost Linux >  >> Linux

Jak zabít všechny procesy na pozadí v zsh?

Toto funguje pro ZSH i 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 `[email protected]` 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 [email protected] $(sed --regexp-extended --quiet 's/\[([[:digit:]]+)\].*/%\1/gp' <<< "$kill_list" | tr '\n' ' ')
    else
        return 0
    fi

}

Odpověď @zyx pro mě nefungovala.

Více o tom zde:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4


jeden by měl použít builtin zsh vestavěný příkaz spolu s dalším kill vestavěný příkaz zsh jako:

builtin kill %1

jako kill je také samostatný binární soubor od util-linux balíček (upstream, mirror) umístěný v /usr/bin/kill který nepodporuje pracovní místa (kill: cannot find process "%1" ).

použijte klíčové slovo builtin abyste předešli konfliktu jmen nebo enable kill vestavěný, pokud je zakázán.

existuje koncept deaktivace a povolení vestavěných příkazů (tj. vlastních příkazů shellu, jako je cd a kill ) v shellech a v zsh můžete povolit (vypnuto) kill vestavěný jako:

enable kill

problém disable zkontrolovat, zda je vestavěný modul zakázán (a enable pro zobrazení povolených).


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

. Je to zsh, nepotřebujete externí nástroje.

Pokud chcete zabít úlohu číslo N:

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

Menší úprava odpovědi @Zxy...

V mém systému jsem zjistil, že pozastavené úlohy nebyly správně ukončeny výchozím signálem zabíjení. Musel jsem to změnit na kill -KILL získat suspended úlohy na pozadí, aby správně zemřely.

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

Věnujte zvláštní pozornost JEDNOTLIVÝM UVÁDĚNÍM. Pokud jste přepnuli na dvojité uvozovky, museli byste ukončit každé "$". Pamatujte, že NELZE použít function zalomit tento příkaz, protože funkce zvýší hodnotu $jobstates pole způsobí, že se funkce pokusí zabít... Musí použít alias.

killjob výše uvedený skript je trochu nadbytečný, protože můžete udělat:

kill %1

Méně stisknutí kláves a již je zabudováno do zsh .


Linux
  1. Jak najít všechny podřízené procesy?

  2. Jak zabít všechny procesy PHP-FPM v jediném příkazovém řádku

  3. Jak použít Ctrl+C k ukončení všech procesů na pozadí spuštěných ve skriptu Bash?

  1. Jak zabít všechny procesy vlastněné `uživatelem` na Centos 7?

  2. Jak zabít všechny procesy kromě konkrétního?

  3. Zabijte všechny procesy konkrétního uživatele přes SSH

  1. Jak zabít všechny procesy s daným částečným názvem?

  2. Jak zabít všechny procesy vrácené pgrep

  3. Jak mohu zabít všechny procesy uživatele pomocí jejich UID