शीर्षक में - zsh में सभी पृष्ठभूमि प्रक्रियाओं को कैसे मारना है?zsh में सभी पृष्ठभूमि प्रक्रियाओं को कैसे मारें?
उत्तर
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
। यह zsh है, बाहरी उपकरणों में कोई ज़रूरत नहीं है।
आप को मारने के लिए काम संख्या 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]+)"`;
सुपर! अब 'echo 123 | निलंबित करने का प्रयास करें कम 'और जांचें कि यह क्या मार देगा। संकेत: जब तक आप 'मार' 'echo 123' प्रक्रिया चलाते हैं, तब तक प्रक्रिया पहले से ही मर जाएगी और इसकी पीआईडी पहले से ही ली जा सकती है। तो आपके 'killbg' के साथ इस तरह के निलंबित पाइप के साथ आप 2 निर्दोष प्रक्रियाओं को मार सकते हैं: '123' (' echo' तर्क) प्रक्रिया और प्रक्रिया' echo' पीआईडी को पुनः प्राप्त करने के लिए हुई प्रक्रिया। – ZyX
मेरा समाधान इस मामले में असफल हो जाएगा (हालांकि यह '{echoPID} = done: {lessPID}' को मारने का प्रयास करेगा। – ZyX
यह दोनों 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
@ Zxy की प्रतिक्रिया में होने वाले मामूली समायोजन ...
अपने सिस्टम पर, मैंने पाया कि निलंबित नौकरियों डिफ़ॉल्ट मार संकेत के साथ ठीक से नहीं मारा गया था। suspended
पृष्ठभूमि नौकरियों को ठीक से मरने के लिए मुझे इसे वास्तव में kill -KILL
पर बदलना पड़ा।
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
इस के आसपास सिंगल कोट पर विशेष ध्यान दें। यदि आप डबल कोट्स पर स्विच करते हैं, तो आपको प्रत्येक "$" से बचने की आवश्यकता होगी। ध्यान दें कि आप इस आदेश को लपेटने के लिए function
का उपयोग नहीं कर सकते हैं क्योंकि फ़ंक्शन $jobstates
सरणी को बढ़ाएगा जिससे फ़ंक्शन स्वयं को मारने का प्रयास कर सकता है ... उपनाम का उपयोग करना चाहिए।
kill %1
कम कीस्ट्रोक्स और यह पहले से ही zsh
में निर्माण किया गया:
ऊपर killjob
स्क्रिप्ट के बाद से तुम सिर्फ कर सकते हैं एक सा अनावश्यक है।
एक 'zsh' नोब के रूप में, मन पहली पंक्ति बताते हुए? –
@ZachRiggle यह 'मैन zshexpn' और' man zshmodules' में है: '$ जॉबस्टेट्स 'एक सहयोगी सरणी पैरामीटर है,' (v) 'इस सरणी से केवल मानों का चयन करता है,' # 'प्रारंभ से शुरू होने वाले zsh को हटाए गए पैटर्न को बनाता है स्ट्रिंग के लिए, हटाने के लिए कम से कम लंबा पैटर्न चुनता है, '*: *:': पैटर्न जो zsh को प्रत्येक मान के पहले दो कोलन से अलग फ़ील्ड को हटा देता है (सरणी मानकों पर '#' प्रत्येक मान पर लागू होता है), '%' जैसा है '#', लेकिन तारों के अंत के लिए और '= *' शून्य को अंतिम ईक चिह्न के बाद सबकुछ हटा देता है जिसमें साइन स्वयं भी शामिल है।प्रत्येक '$ जॉबस्टेट्स 'मान' जॉब-स्टेट 'जैसा दिखता है: निशान: pid = state ...'। – ZyX
ऐसा प्रतीत होता है कि मेरे पास यहां एक बग है: अगर पूरे पाइप को निलंबित कर दिया गया तो यह काम नहीं करता है। – ZyX