2012-10-31 13 views

risposta

9
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 
+0

Come un noob 'zsh', la mente che spiega quella prima linea? –

+1

@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

+0

Sembra che abbia un bug qui: non funziona se l'intera pipa è stata sospesa. – ZyX

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

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

+0

La mia soluzione fallirà in questo caso (tenterà di uccidere '{echoPID} = done: {lessPID}'). – ZyX

0

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

0

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.

0

è builtin kill %1 per su

come kill è un binario da util-linux pacchetto si trova nella /usr/bin/kill

che non supporta posti di lavoro (kill: cannot find procses "%1")

uso di parole chiave builtin per evitare nome conflitto

Problemi correlati