GNU/Linux >> Linux Esercitazione >  >> Linux

Come uccidere tutti i processi in background in zsh?

Questo funziona sia per ZSH che per 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

}

La risposta @zyx non ha funzionato per me.

Maggiori informazioni qui:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4


si dovrebbe usare il builtin zsh comando integrato insieme all'altro kill zsh comando integrato come:

builtin kill %1

come kill è anche un file binario separato da util-linux pacchetto (upstream, mirror) che si trova in /usr/bin/kill che non supporta posti di lavoro (kill: cannot find process "%1" ).

usa la parola chiave builtin per evitare conflitti di nome o enable l'kill integrato se è disabilitato.

esiste un concetto di disabilitazione e abilitazione dei comandi integrati (ad es. i comandi propri della shell come cd e kill ) nelle shell e in zsh puoi abilitare (disabilitato) kill incorporato come:

enable kill

numero disable per verificare se il builtin è disabilitato (e enable per vedere quelli abilitati).


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

. È zsh, non c'è bisogno di strumenti esterni.

Se vuoi uccidere il lavoro numero N:

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

Piccolo aggiustamento alla risposta di @Zxy...

Sul mio sistema, ho scoperto che i lavori sospesi non venivano interrotti correttamente con il segnale di interruzione predefinito. Ho dovuto effettivamente cambiarlo in kill -KILL per ottenere suspended lavori in background per morire correttamente.

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

Presta particolare attenzione alle virgolette singole intorno a questo. Se sei passato alle virgolette doppie, dovresti eseguire l'escape di ogni "$". Nota che NON puoi usare un function per eseguire il wrapping di questo comando poiché la funzione incrementerà $jobstates array che fa sì che la funzione tenti di uccidersi... Deve usare un alias.

Il killjob script sopra è un po' ridondante dato che puoi semplicemente fare:

kill %1

Meno sequenze di tasti ed è già integrato in zsh .


Linux
  1. Come eliminare tutti i processi di proprietà di `user` su Centos 7??

  2. Come uccido tutti i processi di un utente usando il loro UID

  3. Uccidi tutti i processi relativi a un'applicazione

  4. Come uccido tutti gli schermi?

  5. Come uccido i processi più vecchi di t?

Come uccidere un processo in Linux? Comandi per terminare

Come uccidere i processi Zombie in Linux

Termina tutti i processi di un utente specifico tramite SSH

Come inviare processi in background su Linux

Come uccidere i processi zombi in Ubuntu

Come terminare i processi MySQL in phpMyAdmin