Come nel titolo: come eliminare tutti i processi in background in zsh?Come uccidere tutti i processi in background in zsh?
risposta
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
. È zsh, non c'è bisogno di strumenti esterni.
Se si vuole uccidere numero di lavoro N:
function killjob()
{
emulate -L zsh
for jobnum in [email protected] ; do
kill ${${jobstates[$jobnum]##*:*:}%=*}
done
}
killjob N
alias killbg='for job in \`jobs -l | egrep -o "([0-9][0-9]+)"`;
Super! Ora prova a sospendere 'echo 123 | meno e controlla cosa ucciderà. Suggerimento: quando si esegue il comando 'kill'' echo 123' sarà già morto e il suo PID potrebbe essere già stato acquisito. Quindi con tale pipe sospesa con il tuo 'killbg' puoi uccidere 2 processi innocenti: processare' 123' (argomento 'echo') ed elaborare quello che è successo per riprendere il PID' echo'. – ZyX
La mia soluzione fallirà in questo caso (tenterà di uccidere '{echoPID} = done: {lessPID}'). – ZyX
Questo funziona sia per ZSH e 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 risposta non ha funzionato per me.
più su di esso qui: https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4
modifiche di minore entità @ risposta di ZXY ...
Sul mio sistema, ho scoperto che i lavori sospesi non sono stati uccisi correttamente con il segnale di default uccidere. Ho dovuto effettivamente cambiarlo in kill -KILL
per ottenere i lavori in background suspended
da morire correttamente.
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
Prestare particolare attenzione alle SINGOLE QUOTE intorno a questo. Se passassi alle doppie virgolette, avresti bisogno di sfuggire a ogni "$". Si noti che NON è possibile utilizzare un function
per eseguire il wrapping di questo comando poiché la funzione incrementerà l'array $jobstates
causando la funzione di tentare di uccidersi ... È necessario utilizzare un alias.
Il killjob
script di cui sopra è un po 'ridondante in quanto basta che si può fare:
kill %1
Meno battute ed è già in costruzione zsh
.
Come un noob 'zsh', la mente che spiega quella prima linea? –
@ZachRiggle Si trova in 'man zshexpn' e' man zshmodules': '$ jobstates' è un parametro array associativo,' (v) 'seleziona solo i valori da questo array,' # rende make zsh rimuovi il pattern dato a partire dall'inizio di stringa, seleziona il modello minimo di lunghezza per la rimozione, '*: *:': modello che rende zsh rimuovere prima i due campi separati da due punti di ogni valore ('#' sui parametri dell'array viene applicato a ciascun valore), '%' è come '#', ma per la fine delle stringhe e '= *' rende zsh rimuovere tutto dopo l'ultimo segno eq incluso il segno stesso.Ogni valore '$ jobstates' assomiglia a' stato-lavoro: mark: pid = stato ... '. – ZyX
Sembra che abbia un bug qui: non funziona se l'intera pipa è stata sospesa. – ZyX