समय के साथ अधिकांश Linux aficionados कड़ी मेहनत से जीती हुई तरकीबों से भरा एक स्पार्कलिंग वॉर चेस्ट अर्जित करता है जो उस समय बहुत काम आ सकता है जब कोई स्थिति आपके टर्मिनल पर त्वरित सोच की मांग करती है। मैंने इन वर्षों में ज्ञान के इन बिट्स को छुपाया और जब भी मुझे किसी ऐसे व्यक्ति के कंधे पर देखने का अवसर मिला जो असाधारण रूप से लिनक्स से अच्छी तरह से वाकिफ था।
आज, आप मेरे साथ टर्मिनल पर जोड़ी बना रहे हैं। हम लिनक्स फाइल सिस्टम और शेल टूल्स और ट्रिक्स की गहराई की खोज कर रहे हैं।
/proc
लो लिनक्स सिस्टम में सबसे उपयोगी निर्देशिकाओं में से एक है /proc
। खरीद के लिए man
पेज proc
:
प्रोक फाइल सिस्टम एक छद्म फाइल सिस्टम है जो कर्नेल डेटा संरचनाओं को एक इंटरफेस प्रदान करता है।
जब man
पेज "छद्म-फाइल सिस्टम" कहता है, तो इसका मतलब है कि यदि आप अपनी डिस्क के नीचे झांकना चाहते हैं, जहां आप एक फ़ाइल का प्रतिनिधित्व करने वाले बिट्स खोजने की उम्मीद कर सकते हैं जैसे कि आप /tmp/launch-codes.txt
पर एक टेक्स्ट फ़ाइल के लिए करेंगे, तो वहां है /proc
पर कुछ भी नहीं। यह चल रहे लिनक्स सिस्टम पर मौजूद और जीवित है, लेकिन पूरी तरह से अनुपस्थित है यदि आप डिस्क को बाहर निकालना और उसका निरीक्षण करना चाहते हैं। /proc
अपने चल रहे कर्नेल के लिए एक नियंत्रण कक्ष प्राप्त करें!
यदि आप अभी अपने स्वयं के /proc
में एक नज़र डालें, तो आपको निम्न की तरह बहुत सारी निर्देशिकाएं मिल सकती हैं:
ls /proc
1 10 10021 10059 10144 ...hundreds more files...
उनमें से प्रत्येक संख्या एक प्रक्रिया आईडी, या PID
का प्रतिनिधित्व करती है - हां, वही PID
जो आपके ब्राउज़र या टर्मिनल प्रोग्राम के लिए प्रक्रिया की पहचान करती है। वास्तव में, आप प्रक्रिया के बारे में बहुत सारी जानकारी से पूछताछ कर सकते हैं। उदाहरण के लिए, आपको याद होगा कि Linux सिस्टम पर प्रक्रिया 1
पारंपरिक रूप से शीर्ष-स्तरीय init
प्रक्रिया है, जो कि अधिकांश आधुनिक प्रणालियों में सिस्टम-आधारित है। आइए देखें कि मेरे सिस्टम पर PID 1
को किक करने वाला कमांड:
cat /proc/1/cmdline
/run/current-system/systemd/lib/systemd/systemd
cmdline
एक फाइल है जो हमें वह कमांड बताती है जिसने प्रक्रिया 1
को शुरू किया - इस मामले में, systemd
ही।
/proc
में एक cmdline
फ़ाइल है जो विशेष रूप से उपयोगी है - /proc/cmdline
, जो वास्तव में आपको बूट समय पर आपके कर्नेल को दिए गए तर्कों को दिखाती है। मेरा बहुत ही loglevel
है, लेकिन मुझे बताता है कि मेरे सिस्टम ने किसी भी अन्य झंडे के साथ बूट किया है, जो मेरे मामले में init
और initrd
है:
cat /proc/cmdline
initrd=\efi\nixos\hx5g5rmvq748m64r32yjmpjk3pmgqmr1-initrd-linux-5.17.11-initrd.efi init=/nix/store/9zvklk45yx41pak2hdxsxmmnq12n712k-nixos-system-diesel-22.05.20220604.d9794b0/init loglevel=4
मेरा NixOS होस्टनाम diesel
है। कृपया ध्यान दें कि मैं अपने लैपटॉप में पेट्रोलियम नहीं डालता।
/proc
केवल-पढ़ने के लिए नहीं है, या तो। जैसे इसका मैन पेज कहता है, /proc
कर्नेल के लिए एक इंटरफ़ेस है, जिसमें कर्नेल के साथ इंटरैक्ट करना शामिल है। /proc/sys
निर्देशिका में कई प्रकार के नॉब्स और डायल होते हैं, लेकिन मैं आपको /proc/sys/vm
दिखाना चाहता हूं, जो हमें कर्नेल की वर्चुअल मेमोरी को देखने देता है। अधिक साहसी बनना चाहते हैं?
मेरी मशीन के वर्तमान मेमोरी उपयोग पर विचार करें।
free -h
total used free shared buff/cache available Mem: 31Gi 22Gi 3.0Gi 4.4Gi 5.6Gi 3.6Gi Swap: 31Gi 130Mi 31Gi
यहां कुछ भी असामान्य नहीं है - लेकिन क्या होगा अगर मैं अपनी याददाश्त को आक्रामक तरीके से मुक्त करना चाहता हूं? जब कैशिंग के लिए मेमोरी का उपयोग करने की बात आती है, तो अधिकांश समय, कर्नेल सबसे अच्छी तरह से जानता है, लेकिन ऐसी कुछ स्थितियाँ हैं जिनमें आप किसी भी मेमोरी को साफ़ करना चाहते हैं जो साफ़ करने के लिए सुरक्षित है - हम किसी भी चल रही प्रक्रिया को तोड़ना नहीं चाहते हैं, बस यदि संभव हो तो स्मृति को पुनः प्राप्त करें।
यह पता चला है कि उसके लिए एक फाइल है। हम sudo tee
में एक echo
कमांड को पाइप करते हैं क्योंकि /proc/sys/vm
आमतौर पर राइट-प्रोटेक्टेड होता है और केवल root
ही उस फाइल को लिख सकता है जिसमें हम रुचि रखते हैं।
echo 1 | sudo tee -a /proc/sys/vm/drop_caches
यह कमांड जो करता है वह प्रभावी रूप से कर्नेल को संकेत देता है, "कृपया किसी भी कैश को मेमोरी में छोड़ दें जिसे आप मेरे सिस्टम पर किसी भी चल रही प्रक्रिया को तोड़े बिना खो सकते हैं।" मेरी मशीन पर यह लगभग 500M मेमोरी खोलता है:
total used free shared buff/cache available Mem: 31Gi 22Gi 3.5Gi 4.4Gi 5.1Gi 3.6Gi Swap: 31Gi 130Mi 31Gi
ठंडा! /proc
में सभी प्रकार की उपयोगी फ़ाइल-जैसी वस्तुएं हैं जो इस तरह की दिलचस्प चीजें कर सकती हैं। यदि आप अधिक जानना चाहते हैं तो बेझिझक man proc
खोलें।
/dev
एक प्रागैतिहासिक curl
के रूप में एक कैरेक्टर डिवाइस जैसे /dev/sda
एक संलग्न डिस्क का प्रतिनिधित्व करता है, लेकिन /dev
पथ के लिए एक और उपयोग है: नेटवर्क अनुरोध भेजने का एक अल्पज्ञात तरीका।
पथ /dev/tcp
वास्तव में लिनक्स कर्नेल द्वारा उजागर किया गया एक फ़ाइल जैसा उपकरण नहीं है, बल्कि वास्तव में आपके चुने हुए शेल की एक विशेषता है जैसे bash
। पोर्ट 80
पर सुनने वाले वेब सर्वर जैसे दूरस्थ समापन बिंदुओं के लिए निम्न-स्तरीय सॉकेट कनेक्शन खोलने के लिए शेल इस पथ पर संचालन को रोक सकते हैं।
आरंभ करने के लिए, /dev/tcp
में फ़ाइल पथ से जुड़ा एक नया फ़ाइल डिस्क्रिप्टर खोलें जो वांछित समापन बिंदु और पोर्ट को इंगित करता है। फ़ाइल डिस्क्रिप्टर संख्या 0, 1 और 2 क्रमशः stdin
, stdout
, और stderr
का प्रतिनिधित्व करते हैं, आप इस नई फ़ाइल डिस्क्रिप्टर 3 को दूरस्थ नेटवर्क एंडपॉइंट के लिए एक पाइप का प्रतिनिधित्व करने के बारे में सोच सकते हैं। हम यहाँ से bash
के उपयोग को मानेंगे।
exec 3<>/dev/tcp/httpbin.org/80
इसके बाद, ओपन फाइल डिस्क्रिप्टर को एक साधारण HTTP अनुरोध का प्लेनटेक्स्ट फॉर्म भेजें। /status/200
के लिए यह GET
अनुरोध भी Host
हेडर को सेट करने की आवश्यकता है ताकि अधिकांश रिवर्स प्रॉक्सी द्वारा ठीक से संभाला जा सके। दो नई लाइनें अनुरोध की समाप्ति का संकेत देती हैं:
echo -e "GET /status/200 HTTP/1.1\r\nHost: httpbin.org\r\n\r\n" >&3
अंत में, एक साधारण रीड ऑपरेशन HTTP प्रतिक्रिया प्राप्त करता है:
cat <&3
आपको नीचे दी गई प्रतिक्रिया के समान प्रतिक्रिया देखनी चाहिए:
HTTP/1.1 200 OK Date: Fri, 10 Jun 2022 21:39:43 GMT Content-Type: text/html; charset=utf-8 Content-Length: 0 Connection: keep-alive Server: gunicorn/19.9.0 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true
बधाई हो! आपने अभी-अभी अपने शेल के अलावा कुछ नहीं का उपयोग करके एक HTTP अनुरोध भेजा है।
/sys
. में तैरना /proc
और /dev
में गोता लगाने के बाद पता लगाने के लिए एक और रूट-स्तरीय निर्देशिका है: गूढ़ /sys
निर्देशिका।
जैसे /proc
और /dev
, /sys
निम्न-स्तरीय तंत्र के लिए एक अन्य फ़ाइल जैसा इंटरफ़ेस है जो ऑपरेटिंग सिस्टम के बहुत करीब बैठता है। विपरीत /proc
- जो अपेक्षाकृत प्रक्रिया-केंद्रित है - और /dev
- जो मॉडल उपकरणों को ब्लॉक करते हैं और अधिक - /sys
कर्नेल मॉडल के कई सार के लिए एक उपयोगी इंटरफ़ेस है।
उदाहरण के लिए, निर्देशिका /sys/class/net
लें। इस निर्देशिका के अंदर, आपको लिंक की एक सूची मिलेगी जो आपके होस्ट पर नेटवर्क इंटरफेस का प्रतिनिधित्व करती है। यहाँ मेरा कैसा दिखता है:
ls /sys/class/net
enp0s20f0u6u4u1 lo tailscale0 wlan0
जैसा कि आप देख सकते हैं, मेरे सिस्टम द्वारा प्रबंधित सक्रिय नेटवर्क कनेक्शन में एक वायर्ड इंटरफ़ेस (इंटरफ़ेस जो en
से शुरू होता है), lo
लूपबैक इंटरफ़ेस, एक टेलस्केल इंटरफ़ेस और मेरा वायरलेस इंटरफ़ेस wlan0
है। इन निर्देशिकाओं में से किसी एक की सामग्री को सूचीबद्ध करने से फाइलों की एक लंबी सूची का पता चलता है, लेकिन आइए विशेष रूप से मेरे वायर्ड नेटवर्क इंटरफेस के लिए दो फाइलों को करीब से देखें:
cat /sys/class/net/enp0s20f0u6u4u1/statistics/rx_bytes cat /sys/class/net/enp0s20f0u6u4u1/statistics/tx_bytes
11281235262 274308842
इनमें से प्रत्येक फाइल क्रमशः प्राप्त बाइट्स और प्रेषित बाइट्स की संख्या का प्रतिनिधित्व करती है। अगर मैं कुछ सेकंड बाद उसी कमांड का उपयोग करता हूं तो देखें कि नंबर कैसे बदलते हैं:
cat /sys/class/net/enp0s20f0u6u4u1/statistics/rx_bytes cat /sys/class/net/enp0s20f0u6u4u1/statistics/tx_bytes
11289633209 274760138
बड़ी संख्या! जाहिरा तौर पर मैं अपने बैंडविड्थ का अधिकतम लाभ उठा रहा हूं। यह कैसे उपयोगी है?
क्या आपने कभी सोचा है कि नेटवर्क उपयोग विजेट कैसे लिखे जाते हैं? अच्छा, अपना बनाने के बारे में कैसे?
नेटवर्क गतिविधि दर प्राप्त करने के लिए statistics
निर्देशिका में उपरोक्त फ़ाइलों का उपयोग करने वाली इस छोटी bash
स्क्रिप्ट को देखें।
interval=1 interface=$1 rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) rx_bytes_rate=0 tx_bytes_rate=0 function fmt() { numfmt --to=iec-i --suffix=B $1 } while true do echo -en " $(fmt $tx_bytes_rate)/s ⬆ $(fmt $rx_bytes_rate)/s ⬇\t\r" sleep $interval old_rx_bytes=$rx_bytes old_tx_bytes=$tx_bytes rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) tx_bytes_rate=$(( ($tx_bytes - $old_tx_bytes) / $interval )) rx_bytes_rate=$(( ($rx_bytes - $old_rx_bytes) / $interval )) done
आप इस स्क्रिप्ट को अपने $PATH
में कहीं रख सकते हैं, इसे chmod +x <script>
के साथ निष्पादन योग्य बना सकते हैं, और इसे script.sh <interface name>
के साथ आज़मा सकते हैं। यहाँ मेरी मशीन पर आउटपुट कैसा दिखता है:
13KiB/s ⬆ 379KiB/s ⬇
यह बहुत मजेदार है! आप इसके लिए कुछ उपयोगों की कल्पना कर सकते हैं: उदाहरण के लिए, एक उपकरण के लिए एक विजेट के रूप में जो कमांड आउटपुट प्रस्तुत कर सकता है या किसी विशेष नेटवर्क इंटरफ़ेस के लिए नेटवर्क गतिविधि को देखने के त्वरित तरीके के रूप में। किसी भी मामले में, इस डेटा के लिए फ़ाइल-आधारित इंटरफ़ेस इसे एक्सेस करना और इसका उपयोग करना असाधारण रूप से आसान बनाता है।
जब आप एक आधुनिक लिनक्स सिस्टम की क्षमताओं को देखते हैं तो यह आपके लिए उपलब्ध सूचनाओं के प्रकारों में एक छोटा सा गोता था। /
में विभिन्न निर्देशिकाओं के कार्य और उद्देश्य को पढ़ने के लिए आप इस तरह के अतिरिक्त गाइड की खोज कर सकते हैं या man hier
जैसी प्रविष्टियों के लिए man
पेज पढ़कर सीधे स्रोत पर जा सकते हैं।
एक्सप्लोर करने में मज़ा लें!