सभी पृष्ठभूमि नौकरियों को मार डालो


63

की तुलना में पृष्ठभूमि नौकरियों को मारने का एक और अधिक कॉम्पैक्ट रूप है:

for i in {1..5}; do kill %$i; done

इसके अलावा, {1..5} में स्पष्ट रूप से एक हार्ड-कोडित मैजिक नंबर है, मैं इसे कैसे सही नंबर होने के साथ "एन" बना सकता हूं:

$(jobs | wc -l)

मैं वास्तव में PS1 का उपयोग पीएस 1 में प्रबंधित नौकरियों के # प्राप्त करने के लिए कर रहा हूं, क्या यह समकक्ष है?


3
kill $(jobs -p)आसान लगता है।
jw013

यदि संभव हो तो मैं व्यक्तिगत रूप से नौकरियों को मारना पसंद करूंगा। (मैं आपकी टिप्पणी को गलत समझ सकता हूं, हालांकि)
रॉबटीनोसिनो

for pid in $(jobs -p); do kill $pid; done?
jw013

3
@ jw013 यह न केवल आसान है, यह वास्तव में सही है (कृपया इसे एक उत्तर के रूप में पोस्ट करें), एक आउटपुट के आधार पर एक समाधान के विपरीत, jobsजिसमें से केवल तभी काम होता है जब नौकरियों में लगातार संख्या होती है। ओह, और "व्यक्तिगत रूप से नौकरियों को मार डालो" व्यर्थ है: killकमांड में कई पीआईडी ​​पास करना बिल्कुल अलग से उन्हें पारित करने के समान है।
गिल्स

मैं गलत तरीके से कमांड में प्रवेश कर रहा था, $ (नौकरियों -p) शब्दों को मार रहा था और मुझे भी बहुत सही लगता है। मानने को तैयार।
रोबॉटीनोसिनो जूल

जवाबों:


102

बस करने के लिए killसभी पृष्ठभूमि द्वारा प्रबंधित नौकरियों bash, कर

kill $(jobs -p)

ध्यान दें कि दोनों के बाद से jobsऔर killमें निर्मित कर रहे हैं bash, आप तर्क सूची की किसी भी त्रुटि में लंबे समय तक नहीं चलना चाहिए ।


2
पोस्टरिटी के लिए भी, जो बाहमट सोचता है, वह यह करने का तरीका है कि zshउन्हें इस विषय पर किसी भी अधिकार के रूप में अयोग्य घोषित किया जाए।
पेथ

मुझे ऐसा लगता है कि मुझे यह पता होना चाहिए, लेकिन यहां '$' कैसे काम करता है?
फर्निश

1
@ स्थानांतरण यहां आप जाएं
jw013

@bahamat वास्तव में काम नहीं करता है क्योंकि पीआईडी ​​2 या 3 के क्षेत्र में हो सकता है, इस पर निर्भर करता है कि नौकरी% + या% में से एक है - या नहीं। क्या काम करता है kill %${(k)^jobdirs}, जो वास्तव में लंबा है; यदि आपको PID को सूचीबद्ध करने की आवश्यकता है तो आप और भी लंबे समय तक उपयोग कर सकते हैं ${${jobstates#*:*:}%%=*}
गिल्स

CentOS पर, मेरा संकेत अधिक इनपुट की प्रतीक्षा कर रहा है>
Janac Meena

15

सबकोमांड के xargsबजाय का उपयोग करें $(jobs -p), क्योंकि यदि jobs -pखाली है तो किल कमांड विफल हो जाएगी।

jobs -p | xargs kill

1
इसका एक ही सटीक प्रभाव है, हालांकि, यह मदद प्रिंट करता है और
कैट

1
कमांड OSX पर ठीक काम करता है लेकिन डेबियन पर काम नहीं करता है
brunocascio

यह CentOS 6
जनक मीना

jobs -p | xargs -rn10 killबेहतर होगा यदि jobs -pकोई पीआईडी ​​वापस नहीं करता है। ध्यान दें कि -rविकल्प GNU एक्सटेंशन है।
Nar --nasK

जैसा कि ऊपर उल्लेख किया गया है, जीएनयू एक्सटेंशन के -rलिए संक्षिप्त प्रारूप है, जिसमें यह निर्देश दिया गया है कि यदि स्टडिन के पास कोई डेटा नहीं है, तो उसे कमांड नहीं चलाना चाहिए। --no-run-if-emptyxargs
एंथोनी जोगेगन

3

मैं जांच करना पसंद करता हूं कि क्या कोई नौकरी है जो उन्हें मारने से पहले मौजूद है - इस तरह से स्क्रिप्ट विफल हो जाएगी अगर कुछ भी नहीं चल रहा है।

यह टाइप करने के लिए भी छोटा है। इसे अपने में फेंक दें .bash_profile:

function killjobs () {
    JOBS="$(jobs -p)";
    if [ -n "${JOBS}" ]; then;
        kill -KILL ${JOBS};
    fi
}

तो भागो:

killjobs

चल रही किसी भी नौकरी को मारने के लिए।


1

मेरे पास कई पृष्ठभूमि वाले कंपाउंड कमांड हैं जिन्हें मैं मैकू पर, प्रत्येक प्रक्रिया में SIGINT भेजकर, इनायत करना चाहता हूं। अन्य समाधानों में से किसी ने भी इसके लिए ठीक से काम नहीं किया, इसलिए मैं इसके साथ आया:

jobs -p | xargs -n1 pkill -SIGINT -g

jobs -p वर्तमान शेल द्वारा शुरू की गई पृष्ठभूमि प्रक्रियाओं को सूचीबद्ध करता है।

xargs -n1 प्रत्येक काम के लिए एक बार pkill निष्पादित करता है।

pkill -SIGINT -g प्रक्रिया समूह में सभी प्रक्रियाओं को SIGINT (ctrl + c के समान) भेजता है।


1

मुझे लगता है कि आउटपुट क्या jobs -pदेता है, इसके आधार पर समाधान थोड़ा अलग हो सकता है। मेरे मामले में

$ jobs -p
[1]  - 96029 running    some job
[2]  + 96111 running    some other job

इसलिए, निम्न करना अच्छा नहीं है।

$ jobs -p | xargs kill
kill: illegal process id: [1]

दूसरी ओर, रनिंग kill $(jobs -p)काम करता है लेकिन बहुत सारे त्रुटि संदेश देता है, क्योंकि गैर-पीआईडी ​​स्ट्रिंग्स को भी पास कर दिया killजाता है।

इसलिए, मेरा समाधान grepपहले पीआईडी ​​के लिए है और फिर xargsनिम्नानुसार उपयोग करें :

$ jobs -p | grep -o -E '\s\d+\s' | xargs kill

1
आप किस खोल का उपयोग कर रहे हैं? क्या echo $0दिखाता है? क्या help jobsदिखाता है? सचित्र आउटपुट पोसिक्स-अनुरूप नहीं है ; किसी भी कार्यान्वयन में इच्छित व्यवहार के साथ jobsएक -pविकल्प होना चाहिए ।
वाइल्डकार्ड

1
इस पर ध्यान दिलाने के लिए धन्यवाद। मैं zsh का उपयोग कर रहा हूं, और यह अजीब आउटपुट का कारण है। मैं बैश करने के लिए स्विच किया और jobs -pकेवल पीआईडी ​​का उत्पादन किया। मैंने अभी सीखा है कि zsh पूरी तरह से POSIX- अनुरूप नहीं है।
फैनचेन बाओ जूल

0

लगता है कि jobs -p | xargs killयह काम करता है, हालांकि यह मारने के लिए कुछ अवांछित उत्पादन का उत्पादन करता है। यहाँ मैं jobs -p+ या - वर्ण होने / न होने से आउटपुट समूहीकृत कर रहा हूँ

function killjobs() {
    JOBS=$(jobs -p)
    echo $JOBS | grep -v "+\|-"| awk '{print $2}' | xargs kill -9
    echo $JOBS | grep "+\|-"| awk '{print $3}' | xargs kill -9
}

और बाद में आप बस कॉल कर सकते हैं killjobs

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.