क्यों "किल" नाम से मेरी स्क्रिप्ट विफल हो जाती है, लेकिन नाम बदलने के बाद पूरी तरह से काम करता है?


12

प्रश्न की स्क्रिप्ट मेरे लोकलहोस्ट पोर्ट 8080 पर नवीनतम प्रक्रिया को समाप्त कर देती है।

#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x

यह काम नहीं किया, अगर स्क्रिप्ट का नाम 'किल' था (इसे प्राप्त करें? नवीनतम को मारें?)। इसने मुझे cmdsubst> स्क्रिप्ट का नाम बदलने के लिए संकेत दिया , 'सब कुछ'। क्या इस व्यवहार के लिए कोई स्पष्टीकरण है? मैं MacOS El Capitán का उपयोग कर रहा हूं।


5
क्या आपके पास एक और फ़ंक्शन, उपनाम, उपयोगिता या अन्य कमांड है killl?
Kusalananda

9
नामों को अस्पष्ट न बनाएं। killlगलत तरीके से वर्तनी के रूप में गलत व्याख्या की जा सकती है kill। स्पष्ट और अधिक वर्णनात्मक होना बेहतर है: kill_latestया kill_last
सीजार

6
type killlउस शेल में आउटपुट क्या है जहां आपने इसे शुरू करने की कोशिश की थी?
Hauke ​​Laging

जवाबों:


27

cmdsubst>zshशेल द्वारा मुद्रित माध्यमिक संकेत है जब यह दर्ज किया जा रहा है कमांड प्रतिस्थापन के अंत की प्रतीक्षा कर रहा है।

यदि आपको केवल दर्ज करने के बाद वह संकेत मिलता है killl<Return>, तो एकमात्र उचित स्पष्टीकरण यह है कि आपके पास एक उपनाम (जो स्ट्रिंग मैक्रो विस्तार का कुछ रूप है) killlउस चीज के लिए फैलता है जिसमें एक अनिर्दिष्ट $(...)कमांड प्रतिस्थापन होता है, जैसे:

$ alias 'killl=echo $(lsof -ti'
$ killl :22
cmdsubst>

जहाँ zshआप उस $(...)कमांड प्रतिस्थापन को बंद करने के लिए कह रहे हैं ।

कुछ और नोट:

  • का उत्पादन lsofपिड द्वारा सॉर्ट किया जाता है। pid नंबर लिपटे हुए हैं, एक बड़ा pid इस बात की गारंटी नहीं है कि प्रक्रिया बाद में शुरू की गई थी।
  • -i:8080 टीसीपी या यूडीपी सॉकेट की रिपोर्ट करेगा, जिसमें स्रोत या गंतव्य पोर्ट के रूप में 8080 पोर्ट है, चाहे वह सुनने, स्वीकार करने या सॉकेट को जोड़ने के लिए हो।
  • यदि आप केवल पीआईडी ​​प्राप्त करना चाहते हैं, तो आप निम्न -tविकल्प का उपयोग कर सकते हैं lsof:lsof -ti:8080 | tail -n2
  • kill -9है kill -s KILLजो एक संकेत है कि आवेदन शान से बाहर निकलने के लिए पर कार्रवाई नहीं कर सकते हैं भेजता है,। इसका उपयोग केवल अंतिम उपाय के रूप में किया जाना चाहिए।

सबसे हाल ही में शुरू की गई प्रक्रिया को मारने के लिए पोर्ट 8080 पर एक सॉकेट बाउंड (या तो अंत) है, आप यह कर सकते हैं:

#! /bin/sh -
unset IFS
pids=$(lsof -ti:8080) &&
  LC_ALL=C ps -o pid=,lstart= -p $pids |
  LC_ALL=C sort -k6,6n -k4,4M -k3,3n -k5,5 -k1,1n |
  awk 'END{system("kill " $1)}'

(मानता है कि GNU sort(जैसा psकि lstartmacOS पर पाया जाता है) और एक कार्यान्वयन जो स्तंभ का समर्थन करता है (जैसे macOS ’और procps-ng, हालांकि कोड को एनपीएस के लिए अपडेट किया जाना होगा-जहां महीने और दिन खेतों की अदला-बदली होती है)।


1

इसने मुझे एक संकेत दिया cmdsubst>

क्योंकि जब आपने कमांड टाइप किया था तो आपने टाइप नहीं किया था

killl
आपने टाइप किया

मारल $ (
या इसी के समान। इसका स्क्रिप्ट के नाम से कोई लेना-देना नहीं था , या यहां तक ​​कि यह पहली बार में एक स्क्रिप्ट थी। आप पूरी तरह से आदेश के साथ एक ही प्रभाव प्राप्त कर सकते हैं:

ज़िक $
शेल का पार्सर एकमात्र आंशिक रूप से पूर्ण कमांड को पूरा करने के लिए अधिक इनपुट की उम्मीद कर रहा था। स्क्रिप्ट नाम के बारे में आपकी सोच पूरी तरह से लाल हेरिंग है।


6
यह कहना एक बहुत बड़ी धारणा है कि उन्होंने killl $(किसी कारण से टाइप किया, और बहुत कम संभावना थी कि उन्होंने ऐसा किया। स्टीफन चेज़लस के उत्तर की संभावना अधिक है।
हेरोहार्ट

1
यदि यह वास्तव में एक टाइपो के कारण है, तो इससे `अधिक होने की संभावना है $(
एमिल जेकाबेक

2
नहीं, एमिल जेकाबेक; `संभावना नहीं है क्योंकि यह एक ही संकेत नहीं देता है । कोशिश करो। नहीं, हेहत्तर; यह टाइप करते समय यह धारणा नहीं है कि यह समान है या उस संकेत को प्राप्त करने का तरीका है । यह एक कटौती है।
JdeBP

1
आप दावा करते हैं कि ओपी "टाइप नहीं करता था" killl, जब स्टीफन चेज़लस बताते हैं, यह पूरी तरह से संभव है कि ओपी वास्तव में टाइप किया था killl। इसलिए, मैंने आपके उत्तर को गलत माना है।
केविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.