2012-10-31 38 views

उत्तर

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

। यह zsh है, बाहरी उपकरणों में कोई ज़रूरत नहीं है।

आप को मारने के लिए काम संख्या N चाहते हैं:

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

एक 'zsh' नोब के रूप में, मन पहली पंक्ति बताते हुए? –

+1

@ZachRiggle यह 'मैन zshexpn' और' man zshmodules' में है: '$ जॉबस्टेट्स 'एक सहयोगी सरणी पैरामीटर है,' (v) 'इस सरणी से केवल मानों का चयन करता है,' # 'प्रारंभ से शुरू होने वाले zsh को हटाए गए पैटर्न को बनाता है स्ट्रिंग के लिए, हटाने के लिए कम से कम लंबा पैटर्न चुनता है, '*: *:': पैटर्न जो zsh को प्रत्येक मान के पहले दो कोलन से अलग फ़ील्ड को हटा देता है (सरणी मानकों पर '#' प्रत्येक मान पर लागू होता है), '%' जैसा है '#', लेकिन तारों के अंत के लिए और '= *' शून्य को अंतिम ईक चिह्न के बाद सबकुछ हटा देता है जिसमें साइन स्वयं भी शामिल है।प्रत्येक '$ जॉबस्टेट्स 'मान' जॉब-स्टेट 'जैसा दिखता है: निशान: pid = state ...'। – ZyX

+0

ऐसा प्रतीत होता है कि मेरे पास यहां एक बग है: अगर पूरे पाइप को निलंबित कर दिया गया तो यह काम नहीं करता है। – ZyX

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

सुपर! अब 'echo 123 | निलंबित करने का प्रयास करें कम 'और जांचें कि यह क्या मार देगा। संकेत: जब तक आप 'मार' 'echo 123' प्रक्रिया चलाते हैं, तब तक प्रक्रिया पहले से ही मर जाएगी और इसकी पीआईडी ​​पहले से ही ली जा सकती है। तो आपके 'killbg' के साथ इस तरह के निलंबित पाइप के साथ आप 2 निर्दोष प्रक्रियाओं को मार सकते हैं: '123' (' echo' तर्क) प्रक्रिया और प्रक्रिया' echo' पीआईडी ​​को पुनः प्राप्त करने के लिए हुई प्रक्रिया। – ZyX

+0

मेरा समाधान इस मामले में असफल हो जाएगा (हालांकि यह '{echoPID} = done: {lessPID}' को मारने का प्रयास करेगा। – ZyX

0

यह दोनों ZSH और बैश के लिए काम करता है:

: ' 
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 जवाब मेरे लिए काम नहीं किया।

अधिक इसे यहाँ पर: https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4

0

@ Zxy की प्रतिक्रिया में होने वाले मामूली समायोजन ...

अपने सिस्टम पर, मैंने पाया कि निलंबित नौकरियों डिफ़ॉल्ट मार संकेत के साथ ठीक से नहीं मारा गया था। suspended पृष्ठभूमि नौकरियों को ठीक से मरने के लिए मुझे इसे वास्तव में kill -KILL पर बदलना पड़ा।

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

इस के आसपास सिंगल कोट पर विशेष ध्यान दें। यदि आप डबल कोट्स पर स्विच करते हैं, तो आपको प्रत्येक "$" से बचने की आवश्यकता होगी। ध्यान दें कि आप इस आदेश को लपेटने के लिए function का उपयोग नहीं कर सकते हैं क्योंकि फ़ंक्शन $jobstates सरणी को बढ़ाएगा जिससे फ़ंक्शन स्वयं को मारने का प्रयास कर सकता है ... उपनाम का उपयोग करना चाहिए।

kill %1 

कम कीस्ट्रोक्स और यह पहले से ही zsh में निर्माण किया गया:

ऊपर killjob स्क्रिप्ट के बाद से तुम सिर्फ कर सकते हैं एक सा अनावश्यक है।

0

उस पर

रूप killutil-linux/usr/bin/kill

में स्थित है जो नौकरियों (kill: cannot find procses "%1")

उपयोग कीवर्ड builtin नाम संघर्ष

से बचने के लिए समर्थन नहीं करता पैकेज से एक द्विआधारी है के लिए builtin kill %1 है

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^