2012-10-31 12 views

Odpowiedz

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

. To jest zsh, nie ma potrzeby w zewnętrznych narzędziach.

Jeśli chcesz zabić numer zadania N:

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

Jako "zsh' noob, umysł wyjaśniający ten pierwszy wiersz? –

+1

@ZachRiggle Jest to w 'man zshexpn' i' man zshmodules': '$ jobstates' jest parametrem asocjacyjnej tablicy,' (v) 'wybiera tylko wartości z tej tablicy,' # 'sprawia, że ​​zsh usuwa dany wzorzec od początku ciągu znaków, wybiera najmniejszy wzorzec do usunięcia, '*: *:': wzór, który powoduje, że zsh usuwa pierwsze dwa pola oddzielone dwukropkami dla każdej wartości ('#' dla parametrów tablicy jest stosowane do każdej wartości), '%' jest jak '#', ale na końcu łańcuchów i '= *' sprawia, że ​​zsh usuwa wszystko po ostatnim znaku eq, włączając w to sam znak.Każda wartość '$ jobsstates' wygląda jak' job-state: mark: pid = state ... '. – ZyX

+0

Wygląda na to, że mam tutaj błąd: nie działa, jeśli cała rura została zawieszona. – ZyX

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

Super! Teraz spróbuj zawiesić 'echo 123 | less' i sprawdź, co zabije. Podpowiedź: do czasu uruchomienia 'kill'' proces echo 123' będzie już martwy, a jego PID może już zostać pobrane. Tak więc z zawieszoną rurą z 'killbg' możesz zabić 2 niewinne procesy: proces' 123' (argument 'echo') i proces, który spowodował odzyskanie' echo' PID. – ZyX

+0

Moje rozwiązanie nie powiedzie się jednak w tym przypadku (spróbuje zabić '{echoPID} = done: {lessPID}'). – ZyX

0

Działa to zarówno dla 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 

} 

@zyx odpowiedź nie działa dla mnie.

Więcej o tym tutaj: https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4

0

Minor korekta @ odpowiedź ZXY za ...

W moim systemie, stwierdziliśmy, że zawieszone zadania nie zginęło poprawnie z sygnałem domyślny zabić. Musiałem faktycznie zmienić to na kill -KILL, aby uzyskać suspended zadań tła, aby umrzeć prawidłowo.

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

Zwróć szczególną uwagę na POJEDYNCZE CYTATY wokół tego. Jeśli przełączyłeś się na podwójne cudzysłowy, musisz uciec z każdego "$". Zauważ, że NIE możesz użyć function do zawijania tego polecenia, ponieważ funkcja zwiększy tablicę $jobstates powodując, że funkcja spróbuje zabić się ... Musi użyć aliasu.

killjob skrypt powyżej jest nieco zbędny, ponieważ można po prostu zrobić:

kill %1 

mniej klawiszy i to już budować w zsh.

0

to builtin kill %1 dla na

jak kill jest binarny z util-linux opakowaniu znajduje się /usr/bin/kill

która nie obsługuje pracy (kill: cannot find procses "%1")

użycie słów kluczowych builtin aby uniknąć nazwa konfliktu

Powiązane problemy