GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie beendet man alle Hintergrundprozesse in zsh?

Dies funktioniert sowohl für ZSH als auch für 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

}

@zyx Antwort hat bei mir nicht funktioniert.

Mehr dazu hier:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4


man sollte den builtin verwenden zsh eingebauter Befehl neben dem anderen kill zsh eingebauter Befehl als:

builtin kill %1

als kill ist auch eine separate binäre Datei ab util-linux Paket (Upstream, Mirror) in /usr/bin/kill die keine Arbeitsplätze fördert (kill: cannot find process "%1" ).

Verwenden Sie das Schlüsselwort builtin um Namenskonflikte zu vermeiden oder enable die kill eingebaut, wenn es deaktiviert ist.

Es gibt ein Konzept zum Deaktivieren und Aktivieren integrierter Befehle (d. h. Shell-eigene Befehle wie cd und kill ) in Shells und in zsh können Sie kill aktivieren (ein deaktiviertes). eingebaut als:

enable kill

geben Sie disable aus um zu prüfen, ob die eingebaute Funktion deaktiviert ist (und enable um die aktivierten zu sehen).


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

. Es ist zsh, keine Notwendigkeit für externe Tools.

Wenn Sie Jobnummer N beenden möchten:

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

Kleine Anpassung an @Zxys Antwort...

Auf meinem System habe ich festgestellt, dass angehaltene Jobs nicht ordnungsgemäß mit dem Standard-Kill-Signal beendet wurden. Ich musste es tatsächlich in kill -KILL ändern um suspended zu erhalten Hintergrundjobs richtig sterben.

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

Achten Sie besonders auf die EINZELNEN ZITATE in diesem Zusammenhang. Wenn Sie zu doppelten Anführungszeichen wechseln, müssen Sie jedes "$" maskieren. Beachten Sie, dass Sie KEINEN function verwenden können um diesen Befehl zu umbrechen, da die Funktion $jobstates erhöht Array, wodurch die Funktion versucht, sich selbst zu töten ... Muss einen Alias ​​verwenden.

Die killjob Das obige Skript ist etwas überflüssig, da Sie einfach Folgendes tun können:

kill %1

Weniger Tastenanschläge und es ist bereits in zsh eingebaut .


Linux
  1. Wie beendet man alle Prozesse, die dem „Benutzer“ auf Centos 7 gehören?

  2. So beenden Sie laufende Prozesse in Linux

  3. Wie kann man alle Prozesse mit einem bestimmten Teilnamen beenden?

  4. So beenden Sie alle PHP-FPM-Prozesse in einer einzigen Befehlszeile

  5. So beenden Sie alle von pgrep zurückgegebenen Prozesse

Wie beendet man einen Prozess in Linux? Befehle zum Beenden

So beenden Sie Zombie-Prozesse in Linux

So senden Sie Prozesse unter Linux an den Hintergrund

So töten Sie Zombie-Prozesse in Ubuntu

So beenden Sie MySQL-Prozesse in phpMyAdmin

Wie kann ich alle gestoppten Jobs beenden?