फ़ाइल को हार्ड लिंक को / dev / null से बदलें


32

मैं एक एप्लिकेशन चला रहा हूं जो log.txt को लिखता है। एप्लिकेशन को एक नए संस्करण में अपडेट किया गया था, जिससे समर्थित प्लगइन्स अब संगत नहीं हैं। यह log.txt में त्रुटियों की एक बड़ी मात्रा को मजबूर करता है और एक अलग लॉग फ़ाइल में लेखन का समर्थन नहीं करता है।

मैं उन्हें अलग लॉग में कैसे लिख सकता हूं?

मैंने एक हार्ड लिंक के साथ log.txt को बदलने पर विचार किया है (एप्लिकेशन सही अंतर नहीं बता सकता है?) या एक हार्ड लिंक जो / dev / null को इंगित करता है। मेरे विकल्प क्या हैं?


तुम बस नहीं कर सकते chmod -w log.txt?
user168715

जवाबों:


30
# cp -a /dev/null log.txt

यह आपके अशक्त डिवाइस को सही प्रमुख और मामूली देव संख्याओं के साथ कॉपी करता है log.txtताकि आपके पास एक और हो null

डिवाइस को कर्नेल में नाम से नहीं जाना जाता है, बल्कि उनकी प्रमुख और छोटी संख्याओं से जाना जाता है। चूँकि मुझे नहीं पता है कि आपने जो ओएस पाया है, उसे सिर्फ उन नंबरों को कॉपी करना सुविधाजनक है जहाँ से हम पहले से ही जानते हैं कि वे हैं। यदि आप इसे गलत मेजर और माइनर नंबरों के साथ बनाते हैं, तो आप सबसे अधिक संभवत: कुछ अन्य डिवाइस, शायद एक डिस्क या कुछ और बना सकते हैं जिसे आप लिखना नहीं चाहते हैं।


4
यह ध्यान देने योग्य है कि इस कमांड की आवश्यकता है sudo(या रूट उपयोगकर्ता के रूप में चल रहा है)। कृपया (अपने उत्तर में) बताएं कि "सही प्रमुख और मामूली देव संख्या" से आपका क्या तात्पर्य है।
mklement0

3
(मैं ओपी नहीं हूं।) मैं अपडेट की सराहना करता हूं, लेकिन मैं अभी भी उलझन में हूं कि "मेजर और माइनर नंबर" फाइल पथ से कैसे संबंधित हैं /dev/null, जैसा कि आपकी कमांड में उपयोग किया गया है। और, मुझे लगता है कि यह टिप्पणी करने के लिए भविष्य पाठकों में मदद मिलेगी अपने जवाब में कि sudoआवश्यक है।
mklement0

1
@wallyk: धन्यवाद, यह जानना वास्तव में अच्छा है। लेकिन मेरी बात यह है: cp -a /dev/null log.txtमेरी टिप्पणियों और मेरे सम्मान के साथ कैसे खेलें ?
mklement0

1
@MALON: दरअसल तुमने किया था, और Ubuntu 14.04 पर आप करते हैं की जरूरत है sudoजब तक आप उपयोगकर्ता के रूप में चल रहा हो होता है, इस आदेश का प्रदर्शन करने के लिए root(जो आम तौर हतोत्साहित किया जाता है)। हार्ड लिंक बनाने के लिए sudo(या के रूप में चल रहा है root) का उपयोग करना ( यह उत्तर) या एक सिमलिंक (@ V.Michel का उत्तर) सब के बाद सही समाधान हो सकता है, अगर फ़ाइल को उस स्थान पर रखा जाना चाहिए जिसे कोई भी उपयोगकर्ता खाता लिख ​​सकता है, लेकिन बात यह है कि उस आवश्यकता को स्पष्ट रूप से नोट करें।
mklement0

1
पुनश्च: मुझे पता है कि प्रमुख, छोटी टिप्पणियों का उपयोग करने की सिफारिश करने वाले प्रश्न पर टिप्पणी से संबंधित है mknod। ध्यान दें कि आम तौर पर टिप्पणियों पर बहुत कम ध्यान दिया जाता है, इसलिए कोई व्यक्ति केवल प्रश्न पढ़ रहा है और फिर आपका उत्तर भ्रमित हो सकता है (जैसा कि मैं भी था; यह भी ध्यान दें कि ज्यादातर लोग बड़ी और छोटी डिवाइस संख्या जैसी अवधारणाओं के संपर्क में नहीं हैं)।
mklement0

65

आप / dev / null को एक प्रतीकात्मक लिंक बना सकते हैं और आपको रूट होने की आवश्यकता नहीं है:

ln -s /dev/null log.txt

इसमें स्व-दस्तावेजीकरण होने का भी फायदा है, ls -l log.txtजिसमें यह दिखाया जाएगा कि यह / s / dev / null के लिए एक सहानुभूति है, बजाय यह जानने के कि "1, 3" यह किसी भी तरह महत्वपूर्ण है।
मोंटी हार्डर

14

यहाँ अन्य उत्तर शायद काम करेंगे। विशेष रूप से, सहिष्णु समाधान शायद सबसे आसान समाधान होने जा रहा है। मैं इसे मुख्य रूप से पूर्णता के लिए प्रस्तुत करता हूं।

यदि फ़ाइल का फाइल सिस्टम उपकरणों का समर्थन नहीं करता है (उदाहरण के लिए, यह विकल्प के साथ मुहिम शुरू की गई थी), तो समाधान अनलिमिटिंग mknod(या cp -a) समस्याग्रस्त हो जाता है nodev। और निश्चित रूप से, फाइलसिस्टम में कठिन लिंक बस काम नहीं करेगा।

हार्ड लिंक या नए डिवाइस नोड्स बनाने का एक विकल्प बाइंड माउंट्स का उपयोग करना है, जो आपको अपने फाइल सिस्टम ट्री के एक हिस्से से दूसरे पर फ़ाइल या निर्देशिका माउंट करने देता है। इसलिए, उदाहरण के लिए, आप चला सकते हैं:

mount -o bind /dev/null /path/to/log.txt

यह एक कड़ी की तरह बहुत काम करता है, लेकिन:

  • यह फाइलसिस्टम में काम कर सकता है (क्योंकि यह हार्ड लिंक की तरह फाइल सिस्टम इनोड पर आधारित नहीं है)
  • यह रीड-ओनली फाइल सिस्टम पर काम करता है (क्योंकि आप वास्तव में फाइल सिस्टम को संशोधित नहीं कर रहे हैं)

एक पूर्ण उदाहरण के लिए:

bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log

लेकिन यह केवल उन्हीं प्रणालियों पर काम करता है जिनमें बाइंड माउंट होता है। (जैसे कि आधुनिक लिनक्स।)
9

एक लॉग फ़ाइल वैसे भी केवल पढ़ने के लिए फाइल सिस्टम में नहीं होती।
मोंटी हार्डर

1
आप आश्चर्यचकित होंगे कि आप कितनी बार अपने आप को केवल पढ़ने के लिए एक फाइल सिस्टम पर एक फाइल में लिखना चाहते हैं। और यह बहुत अच्छी तरह से एक nodevफाइल सिस्टम पर हो सकता है ।
लार्क्स

6

यह गंभीर रूप से HOW पर निर्भर करता है कि एप्लीकेशन log.txt को हैंडल करता है।

यदि आवेदन सिर्फ मौजूदा फ़ाइल को खोलता है और उसे लिखता है तो जैसा कि अन्य उत्तरों में वर्णित है आप इसे / देव / अशक्त कर सकते हैं, इसे कहीं और सिमिलिंक कर सकते हैं, इसे कहीं और हार्डलिंक कर सकते हैं (हालांकि हार्डलिंक को फाइल सिस्टम से पार नहीं किया जा सकता है इसलिए isn ' इसमें बहुत सारे बिंदु) / देव / अशक्त उपकरण नोड की एक प्रति बनाएँ आदि।

OTOH यदि अनुप्रयोग हटाता है और log.txt को फिर से बनाता है तो कोई भी काम नहीं करेगा। आप पूरी निर्देशिका को किसी अन्य फ़ाइल सिस्टम पर लिखने को पुनर्निर्देशित करने के लिए कहीं और सह सकते हैं, लेकिन इसके बारे में और आपको निर्देशिका में अन्य सामान से निपटना होगा।

मुझे लगता है कि अगर आप वास्तव में चाहते थे कि आप एक कस्टम ओवरले फाइलसिस्टम बना सकें, जो लॉगऑनक्स्ट नामक एक फाइल बनाने के लिए किसी भी प्रयास को दूर करने के दौरान सबसे अधिक संचालन के माध्यम से ठीक से गुजरता है।


chattr +i log.txtपहली बार और एप्लिकेशन अब फ़ाइल को नहीं हटाएगा।
मार्को मार्सला

3

खैर, नाम पाइप के साथ एक अप्रिय विधि

# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null

आप लगभग डंप किए गए लॉग के साथ कुछ भी कर सकते हैं, जैसे फ़िल्टर या एनसी पर भेजें ।


यदि catप्रक्रिया को मार दिया जाता है या दुर्घटनाग्रस्त हो जाता है, तो पाइप भरा होने पर लॉगिन प्रोग्राम लटका रहेगा।
मार्को मार्सला

-1

फ़ाइल को एक वास्तविक अशक्त उपकरण बनाने पर विचार करें। एक फ़ाइल "log.txt" mknod के साथ बनाई गई, सही फ़ाइल प्रकार और उसी मामूली और प्रमुख संख्याओं के साथ, यह एक अशक्त डिवाइस के रूप में कार्य करेगा क्योंकि यह है।


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