2012-10-31 19 views

cevap

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

. Zsh, harici araçlara gerek yok.

Eğer iş numarası N öldürmek isterseniz:

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

Bir 'zsh' noob, ilk satırı açıklayan bir zihin olarak? –

+1

@ZachRiggle Bu adam zshexpn'de ve adam zshmodules''ndedir: '$ jobstates' bir ilişkisel dizi parametresidir,' (v) 'sadece bu dizideki değerleri seçer,' '' zsh başlangıçtan başlayarak verilen deseni kaldırır dizgisi, kaldırma için en az uzun desen seçer, '*: *:': zsh her iki değerin kolon ikiye ayrılmış alanlarını kaldırır. ('' '' dizi parametrelerinde her bir değere uygulanır), '%' '' ', ancak dizelerin sonu ve' = * ', zsh işareti de dahil olmak üzere son eq işaretinden sonra her şeyi kaldırır.Her bir "$ jobstates" değeri, iş durumu gibi görünür: mark: pid = state ... '. – ZyX

+0

Görünüşe göre burada bir hata var: Tüm boru askıya alınmışsa çalışmaz. – ZyX

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

Super! Şimdi askıya almayı deneyin echo 123 | Daha azını ve ne öldüreceğini kontrol et. İpucu: "kill" echo 123'ü çalıştırdığınız zaman süreci zaten ölmüş olacak ve PID'si zaten alınmış olabilir. Böylece "killbg" ile bu tür askıda boru ile 2 masum süreçleri öldürebilirsiniz: süreç "123" (echo 'argüman) ve' echo 'PID tekrarlamak için oldu süreci. – ZyX

+0

Bu durumda çözümüm başarısız olacaktır ('{echoPID} = işini bitirmeye çalışacaktır: {lessPID} '). – ZyX

0

Bu ZSH ve Bash ikisi için çalışır:

: ' 
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 cevap benim için çalışmadı. şurada üzerine

Daha: @ ZXY cevabı için https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4

0

Minör ayarı ...

benim sistemde Uzaklaştırıldım işler varsayılan öldürmek sinyali ile düzgün öldürülmemiş olduğunu bulmuşlardır. Düzgün ölmek için suspended arka plan işlerini almak için onu kill -KILL olarak değiştirmem gerekiyordu.

Bu bölümdeki TEK ÇEKİMLER'e özellikle dikkat edin. Çift tırnaklara geçtiyseniz, her "$" den kaçmanız gerekir. Fonksiyonun kendini öldürmeyi denemesine neden olan $jobstates dizisini artıracağından bu komutu sarmak için function kullanamazsınız. Bir takma ad kullanmak gerekir.

kill %1 

Az tuş vuruşlarını ve zaten zsh içine inşa ediyor:

yukarıda killjob senaryo aynı senin çünkü biraz gereksiz olduğunu.

0

o isim çakışması

önlemek için işleri ( kill: cannot find procses "%1")

kullanım anahtar kelime builtin desteklemediği /usr/bin/kill

bulunan util-linux paketinden ikili olduğunu

kill olarak için builtin kill %1 olduğunu