समय के साथ अधिकांश Linux aficionados कड़ी मेहनत से जीती हुई तरकीबों से भरा एक स्पार्कलिंग वॉर चेस्ट अर्जित करता है जो उस समय बहुत काम आ सकता है जब कोई स्थिति आपके टर्मिनल पर त्वरित सोच की मांग करती है। मैंने इन वर्षों में ज्ञान के इन बिट्स को छुपाया और जब भी मुझे किसी ऐसे व्यक्ति के कंधे पर देखने का अवसर मिला जो असाधारण रूप से लिनक्स से अच्छी तरह से वाकिफ था। आज, आप मेरे साथ टर्मिनल पर जोड़ी बना रहे हैं। हम लिनक्स फाइल सिस्टम और शेल टूल्स और ट्रिक्स की गहराई की खोज कर रहे हैं। मेरे साथ एक लो /proc लिनक्स सिस्टम में सबसे उपयोगी निर्देशिकाओं में से एक है । खरीद के लिए पेज : /proc man proc प्रोक फाइल सिस्टम एक छद्म फाइल सिस्टम है जो कर्नेल डेटा संरचनाओं को एक इंटरफेस प्रदान करता है। जब पेज "छद्म-फाइल सिस्टम" कहता है, तो इसका मतलब है कि यदि आप अपनी डिस्क के नीचे झांकना चाहते हैं, जहां आप एक फ़ाइल का प्रतिनिधित्व करने वाले बिट्स खोजने की उम्मीद कर सकते हैं जैसे कि आप पर एक टेक्स्ट फ़ाइल के लिए करेंगे, तो वहां है पर कुछ भी नहीं। यह चल रहे लिनक्स सिस्टम पर मौजूद और जीवित है, लेकिन पूरी तरह से अनुपस्थित है यदि आप डिस्क को बाहर निकालना और उसका निरीक्षण करना चाहते हैं। अपने चल रहे कर्नेल के लिए एक नियंत्रण कक्ष प्राप्त करें! man /tmp/launch-codes.txt /proc /proc यदि आप अभी अपने स्वयं के में एक नज़र डालें, तो आपको निम्न की तरह बहुत सारी निर्देशिकाएं मिल सकती हैं: /proc ls /proc 1 10 10021 10059 10144 ...hundreds more files... उनमें से प्रत्येक संख्या एक प्रक्रिया आईडी, या का प्रतिनिधित्व करती है - हां, वही जो आपके ब्राउज़र या टर्मिनल प्रोग्राम के लिए प्रक्रिया की पहचान करती है। वास्तव में, आप प्रक्रिया के बारे में बहुत सारी जानकारी से पूछताछ कर सकते हैं। उदाहरण के लिए, आपको याद होगा कि Linux सिस्टम पर प्रक्रिया पारंपरिक रूप से शीर्ष-स्तरीय प्रक्रिया है, जो कि अधिकांश आधुनिक प्रणालियों में सिस्टम-आधारित है। आइए देखें कि मेरे सिस्टम पर को किक करने वाला कमांड: PID PID 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 आरंभ करने के लिए, में फ़ाइल पथ से जुड़ा एक नया फ़ाइल डिस्क्रिप्टर खोलें जो वांछित समापन बिंदु और पोर्ट को इंगित करता है। फ़ाइल डिस्क्रिप्टर संख्या 0, 1 और 2 क्रमशः , , और का प्रतिनिधित्व करते हैं, आप इस नई फ़ाइल डिस्क्रिप्टर 3 को दूरस्थ नेटवर्क एंडपॉइंट के लिए एक पाइप का प्रतिनिधित्व करने के बारे में सोच सकते हैं। हम यहाँ से के उपयोग को मानेंगे। /dev/tcp stdin stdout stderr 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 एक्सप्लोर करने में मज़ा लें!