लिनक्स पर सुरक्षित रूप से tmp फ़ोल्डर की सफाई कैसे करें


15

मैं सटीक होने के लिए अपने tmpfs / tmp, 2GB के लिए RAM का उपयोग करता हूँ। आम तौर पर, यह पर्याप्त है लेकिन कभी-कभी, प्रक्रियाएं वहां फाइलें बनाती हैं और खुद के बाद सफाई करने में विफल रहती हैं। ऐसा हो सकता है अगर वे दुर्घटना करते हैं। मुझे इन अनाथ tmp फ़ाइलों को हटाने की आवश्यकता है अन्यथा भविष्य की प्रक्रिया / tmp पर अंतरिक्ष से बाहर चलेगी।

मैं सुरक्षित रूप से कचरा इकट्ठा / tmp कैसे कर सकता हूं? कुछ लोग इसे अंतिम संशोधन टाइमस्टैम्प की जांच करके करते हैं, लेकिन यह दृष्टिकोण असुरक्षित है क्योंकि लंबे समय तक चलने वाली प्रक्रिया हो सकती है जो अभी भी उन फ़ाइलों की आवश्यकता है। एक सुरक्षित दृष्टिकोण अंतिम संशोधन टाइमस्टैम्प स्थिति को इस शर्त के साथ जोड़ना है कि किसी भी प्रक्रिया में फ़ाइल के लिए फ़ाइल हैंडल नहीं है। क्या कोई ऐसा कार्यक्रम / स्क्रिप्ट / आदि है जो इस दृष्टिकोण या कुछ अन्य दृष्टिकोण को सुरक्षित रखता हो?

संयोग से, क्या लिनक्स / यूनिक्स निर्माण के साथ फ़ाइल खोलने की एक ऐसी अनुमति देता है जिसमें निर्मित फ़ाइल को हटा दिया जाता है जब निर्माण प्रक्रिया समाप्त हो जाती है, भले ही यह दुर्घटना से हो?


: यदि आप के बजाय / tmp tmpfs इस्तेमाल कर सकते हैं की जाँच करें kernel.org/doc/Documentation/filesystems/tmpfs.txt
ott--

जवाबों:


15

आप कुछ इस तरह की कोशिश करना चाह सकते हैं:

find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'

फाइंड का उपयोग उन फाइलों को खोजने के लिए किया जाता है जो कुछ मानदंडों से मेल खाती हैं।

  • -mtime +7 केवल 7 दिनों से अधिक पुरानी फ़ाइलों का चयन करता है (आप किसी अन्य मूल्य का उपयोग कर सकते हैं)
  • -exec fuser -s {} ';'हर फ़ाइल में मूक मोड में फ़्यूज़र को कॉल करता है जो पुरानेपन के मानदंडों से मेल खाता है। fuser हर फ़ाइल के लिए 0 (= true) देता है जिसे अभी एक्सेस किया गया है और 1 (= गलत) अनधिकृत लोगों के लिए है। जैसा कि हम केवल अनजान लोगों में रुचि रखते हैं, हम -notइस के सामने रखते हैं-exec
  • -exec echo {} ';'बस सभी फ़ाइल नामों को प्रिंट करता है जो मापदंड से मेल खाता है। आप -exec rm {} ';'यहाँ के बजाय उपयोग करना चाहते हैं , लेकिन के रूप में यह अभी भी उपयोग की कुछ फ़ाइलों को हटा सकते हैं, मुझे लगता है कि यह एक सरल गूंज पहले सुरक्षित है।
  • संपादित करें: आप आकस्मिक प्रभावों से बचने के लिए कुछ चीज़ों को जोड़ना -name 'foo*.bar'या -uid 123क्लीन फ़ाइल के प्रभाव को विशिष्ट फ़ाइल पैटर्न या उपयोगकर्ता आईडी तक सीमित करना चाह सकते हैं ।

अंतिम बिंदु तक: विचार करें कि ऐसी फाइलें हो सकती हैं जो केवल एक बार लिखी जाती हैं (जैसे सिस्टम बूट पर) लेकिन अक्सर पढ़ी जाती हैं (उदाहरण के लिए कोई भी एक्स-सत्र-कुकी)। इसलिए मैं आपके दोषपूर्ण कार्यक्रमों द्वारा बनाई गई फ़ाइलों को प्रभावित करने के लिए कुछ नाम चेक जोड़ने की सलाह देता हूं।

edit2: आपके अंतिम प्रश्न के लिए: एक फ़ाइल को डिस्क से तब तक नहीं हटाया जाएगा जब तक कि किसी भी प्रक्रिया के लिए एक खुला हैंडल न हो (कम से कम देशी लिनक्स फाइल सिस्टम के लिए)। समस्या यह है कि निर्देशिका प्रविष्टि को तुरंत हटा दिया जाता है, जिसका अर्थ है कि जब आप फ़ाइल को निकालते हैं, तो कोई भी नई प्रक्रिया फ़ाइल को नहीं खोल सकती है (क्योंकि इसमें कोई फ़ाइल नाम संलग्न नहीं है)।

विवरण के लिए देखें: /programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux

edit3: लेकिन क्या होगा अगर मैं पूरी प्रक्रिया को स्वचालित करना चाहता था?

जैसा कि मैंने कहा, ऐसी फाइलें हो सकती हैं जो एक बार लिखी जाएं और फिर एक बार (जैसे एक्स सेशन कुकीज, पीआईडी ​​फाइलें आदि) हर एक बार पढ़ें। उन लोगों को इस निष्कासन स्क्रिप्ट से बाहर नहीं किया जाएगा (यही कारण है कि आप echoवास्तव में फ़ाइलों को हटाने से पहले पहले एक परीक्षण चलाना चाहते हैं )।

एक सुरक्षित समाधान को लागू करने का एक तरीका उपयोग करना है atime
atimeप्रत्येक फ़ाइल को अंतिम बार एक्सेस करने का समय संग्रहीत करता है। लेकिन वह फ़ाइल सिस्टम विकल्प अक्सर अक्षम होता है क्योंकि इसका कुछ प्रदर्शन प्रभाव पड़ता है ( 20-30% क्षेत्र में इस ब्लॉग के अनुसार )। वहाँ है relatime, लेकिन अगर mtimeकोई बदल गया है तो केवल एक्सेस समय लिखता है , इसलिए यह हमारी मदद नहीं करेगा।

यदि आप उपयोग करना चाहते हैं atime, तो मैं /tmpएक अलग विभाजन (आदर्श रूप से एक रैमडिस्क) पर रखने की सलाह दूंगा ताकि पूरे सिस्टम पर प्रदर्शन प्रभाव बहुत बड़ा न हो।

एक बार atimeसक्षम होने के बाद, आपको बस इतना करना है -mtimeकि उपरोक्त कमांड लाइन में पैरामीटर को बदलें -atime
आप इसे हटाने में सक्षम हो सकते हैं -not -exec fuser -s {} ';', लेकिन मैं यह सुनिश्चित करने के लिए वहां रखूंगा (यदि मामले में एप्लिकेशन लंबे समय तक फाइलें खुली रखें)।

लेकिन echoअपने सिस्टम को अभी भी जरूरत के सामान को हटाने से पहले कमांड का उपयोग करने के लिए ध्यान रखें !


अच्छा। लंबे समय से चल रही प्रक्रिया द्वारा बंद की गई फाइलों के बारे में क्या है जबकि यह उन्हें अपडेट नहीं कर रही है? यदि वे संदर्भ फ़ाइलें हैं, तो आप प्रक्रिया संदर्भ को ढीला कर सकते हैं (वास्तव में, यह एक बहुत ही स्मार्ट प्रक्रिया नहीं है; लेकिन किसी को 'पार्श्व' /tmp/सफाई के अपेक्षित दुष्प्रभावों को जानना होगा )।
एनआईसी

यह इस दृष्टिकोण की समस्या है (जैसा कि मैं पिछले पैराग्राफ में इंगित कर रहा था)। यहाँ सबसे अच्छा तरीका यह होगा कि यूआईडी / जीआईडी ​​या फ़ाइल पैटर्न की जाँच को जोड़ा जाए (तदनुसार उत्तर को संपादित किया जाए)
18

क्या इसे क्रोन लिपि में रखा जाना चाहिए ...?
CMCDragonkai

@CMCDragonkai निश्चित रूप से आप इसे crontab में डाल सकते हैं। लेकिन जैसा कि मैंने उल्लेख किया है कि ऐसी फाइलें हो सकती हैं जो एक्सेस की जाती हैं लेकिन लिखी नहीं जाती हैं और इसलिए इसे इस छोटी स्क्रिप्ट द्वारा फ़िल्टर नहीं किया जा सकता है। इसीलिए पहले प्रभावित फाइलों की सूची को प्रिंट करना सुरक्षित है और फिर खुद तय करें कि उन्हें हटाना है या नहीं। यदि आपका /tmpएक अलग विभाजन (उदाहरण के लिए एक रैमडिस्क) पर है, तो आप इसके लिए सक्षम हो सकते हैं atimeऔर के -atimeपैरामीटर का उपयोग कर सकते हैं find
मेरिठूब

मैं एक सर्वर पर ऐसा करने की योजना बना रहा हूं। इसलिए मैं हर समय tmp में सभी फाइलों को गिनने के लिए नहीं हो सकता। क्या कोई समस्या होगी? इसके अलावा, मुझे लगा कि हम सापेक्षता का उपयोग करने के लिए थे, न कि अपराध?
CMCDragonkai

4

अपना खुद का रोल मत करो।

डेबियन / उबंटू में टैम्प्रेपर है, यह संभवतः अन्य डिस्ट के साथ भी उपलब्ध है।

# tmpreaper - cleans up files in directories based on their age

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 

में /etc/tmpreaper.confफ़ाइल, अगर मैं दोनों सेट /tmpऔर /var/tmpसफाई निर्देशिका के रूप में, लंबे समय से आप के लिए सलाह देते हैं क्या कर सकते हैं TMPREAPER_TIMEपैरामीटर या tmp फ़ाइलों की अधिकतम पहले हटा दिया जाना चाहिए? मैंने सुना है कि /var/tmpफाइलों की तुलना में लंबी उम्र रखना बेहतर है /tmp। लेकिन अगर वे केवल एक ही अधिकतम उम्र के साथ सेट हो सकते हैं, तो मेरे पास कोई सुराग नहीं है।
Xiaodong क्यूई

2

आपके प्रश्न के अंतिम भाग के बारे में:

हालांकि मुझे नहीं लगता है कि 'डिलीट-दिस-इफ-आई-डाई' ओपन / क्रिएशन मोड मौजूद है, एक प्रक्रिया इसे बनाने के बाद सीधे एक फाइल को सुरक्षित रूप से हटा सकती है, जब तक कि यह उक्त फाइल को खोलने के लिए एक हैंडल रखता है। कर्नेल तब फ़ाइल को डिस्क पर रखेगा और जैसे ही अंतिम प्रक्रिया जिसने फ़ाइल को खोला था (दुर्घटना या सामान्य रूप से हो), फ़ाइल द्वारा कब्जा कर लिया गया स्थान खाली कर दिया जाएगा।

समस्या के इर्द-गिर्द सामान्य तरीके के लिए कि कुछ प्रक्रियाएँ कभी-कभी साफ़ / tmp नहीं होती हैं, मैं यहाँ या यहाँ उदाहरण के लिए, वर्णित नाम स्थान पर एक नज़र रखने का सुझाव दूंगा । यदि प्रश्न में प्रक्रिया एक सिस्टम डेमॉन है, तो सिस्टमड और निजी / tmp फाइल सिस्टम को अनुमति देने के लिए इसकी मूल विशेषता ब्याज की हो सकती है।



0

एक से अधिक पुरानी फ़ाइलों की एक सूची प्राप्त करें, उन फ़ाइलों को छोड़ दें जो उस सूची से किसी भी चीज़ से खुली हों:

find /tmp -mtime +7 |\
    egrep -v "`lsof -n +D /tmp | awk 'NR>1 {print $9}'| tr \\n \|`" 

lsof -n +D /tmp/ tmp में खुली फाइलों को देखें
awk 'NR>1 {print $9}': lsof आउटपुट के केवल नौवें कॉलम को प्रिंट करें, हेडर को छोड़कर
tr \\n \|: नई-लाइन को बार से बदलें (या egrep में)
egrep -v "foo|moo|bar": प्रिंट लाइनें जिसमें foo या moo या बार नहीं हैं


0

मैं उपरोक्त के साथ सहमत हूं, हालांकि इसे जोड़ने के लिए- मैं हमेशा दौड़ता हूं lsof +L1 | grep tmpऔर या तो "हटाए गए" टीएमपी फाइलों को पकड़े हुए प्रक्रियाओं को मारता हूं या फिर से शुरू करता हूं: उदाहरण-

# lsof +L1 | grep tmp
xfce4-ter  1699  user   32u   REG    8,6      192     0 818552 /tmp/vte966VLX (deleted)
chrome     3301  user  138u   REG    8,6    16400     0 818547 /tmp/etilqs_Z0guKD7p6ork9iG (deleted)

2
एसयू बेतरतीब ढंग से पदों की व्यवस्था करता है - इसलिए ऊपर या नीचे नहीं है। आप किस पोस्ट का जिक्र कर रहे हैं?
जर्नीमैन गीक

0

आप बस कर सकते हैं rm -rf /tmp/*और आशा करते हैं कि कुछ भी नहीं टूटेगा ...


1
कुछ करने का सुझाव "और आशा है कि कुछ भी नहीं टूटता है" वास्तव में ओपी का जवाब नहीं देता है "क्या ऐसा करने का एक सुरक्षित तरीका है। शायद आप इस बारे में विस्तार से बता सकते हैं कि आपका सुझाव क्यों सुरक्षित है?
बर्टिब

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