मैं आपको एक वास्तविक जीवन परिदृश्य के आधार पर कुछ जटिल उदाहरण के माध्यम से चलने जा रहा हूं।
संकट
मान लें कि conky
मेरे डेस्कटॉप पर कमांड ने प्रतिक्रिया देना बंद कर दिया है, और मैं इसे मैन्युअल रूप से मारना चाहता हूं। मुझे यूनिक्स का थोड़ा बहुत पता है, इसलिए मुझे पता है कि मुझे जो करने की आवश्यकता है वह कमांड निष्पादित है kill <PID>
। आदेश पीआईडी को पुनः प्राप्त करने में, मैं उपयोग कर सकते हैं ps
या top
या जो भी उपकरण मेरे यूनिक्स वितरण मुझे दे दिया है। लेकिन मैं इसे एक कमांड में कैसे कर सकता हूं?
उत्तर
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
अस्वीकरण: यह आदेश केवल कुछ मामलों में काम करता है। अपने टर्मिनल में इसे कॉपी / पेस्ट न करें और इसका उपयोग करना शुरू करें, यह बिना सोचे समझे प्रक्रियाओं को मार सकता है। बल्कि इसे बनाना सीखें ।
यह काम किस प्रकार करता है
1- ps aux
यह कमांड रनिंग प्रक्रियाओं की सूची और उनके बारे में कुछ जानकारी का उत्पादन करेगा। दिलचस्प जानकारी यह है कि यह प्रत्येक प्रक्रिया के पीआईडी को अपने दूसरे कॉलम में आउटपुट करेगा। यहाँ मेरे बॉक्स पर कमांड के आउटपुट से एक अर्क है:
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
मुझे केवल एक प्रक्रिया में दिलचस्पी है, इसलिए मैं grep
अपने कार्यक्रम के अनुरूप प्रविष्टि खोजने के लिए उपयोग करता हूं conky
।
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3- grep -v grep
जैसा कि आप चरण 2 में देख सकते हैं, कमांड अपनी सूची में प्रक्रिया को ps
आउटपुट करता grep conky
है (यह सभी के बाद चलने वाली प्रक्रिया है)। इसे छानने के लिए, मैं चला सकता हूं grep -v grep
। विकल्प पैटर्न से युक्त लोगों को छोड़कर सभी लाइनों से मेल खाना -v
बताता grep
है ।
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: मैं एक grep
कॉल में चरण 2 और 3 करने का तरीका जानना पसंद करूंगा ।
4- awk '{print $2}'
अब जब मैंने अपनी लक्ष्य प्रक्रिया को अलग कर लिया है। मैं इसका पीआईडी प्राप्त करना चाहता हूं। दूसरे शब्दों में, मैं आउटपुट के दूसरे शब्द को पुनः प्राप्त करना चाहता हूं। मेरे लिए भाग्यशाली, अधिकांश (सभी?) आधुनिक इकाइयां awk
, एक स्क्रिप्टिंग भाषा का कुछ संस्करण प्रदान करेगी , जो सारणीबद्ध डेटा के साथ चमत्कार करती है। हमारा काम जितना आसान हो जाता है print $2
।
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
मेरे पास पीआईडी है। बस मुझे इसे पास करना है kill
। ऐसा करने के लिए, मैं उपयोग करूंगा xargs
।
xargs kill
इनपुट से पढ़ा जाएगा (पाइप से हमारे मामले में), एक कमांड बनाएं जिसमें kill <items>
( <items>
इनपुट से जो भी पढ़ा जाए) शामिल है, और फिर बनाई गई कमांड को निष्पादित करें। हमारे मामले में यह निष्पादित करेगा kill 1948
। मिशन पूरा हुआ।
अंतिम शब्द
ध्यान दें कि आपके द्वारा उपयोग किए जा रहे यूनिक्स के किस संस्करण के आधार पर, कुछ प्रोग्राम अलग तरीके से व्यवहार कर सकते हैं (उदाहरण के लिए, ps
कॉलम 3 में पीआईडी का उत्पादन कर सकते हैं)। यदि कुछ गलत या अलग लगता है, तो अपने विक्रेता के प्रलेखन (या बेहतर, man
पृष्ठों) को पढ़ें । इसके अलावा सावधान रहें क्योंकि लंबे पाइप खतरनाक हो सकते हैं। विशेष रूप से जब की तरह कमांड का प्रयोग किसी भी मान्यताओं मत करो kill
या rm
। उदाहरण के लिए, यदि कोई अन्य उपयोगकर्ता है जिसका नाम 'conky' (या 'Aconkyous') है, तो मेरा कमांड उसके सभी रनिंग प्रोसेस को भी मार सकता है!
मैं जो कह रहा हूं वह सावधान रहना है, खासकर लंबे पाइपों के लिए। अंतःक्रियात्मक रूप से इसे बनाने के लिए हमेशा बेहतर होता है जैसा कि हमने यहां किया था, धारणा बनाने और बाद में खेद महसूस करने के लिए।