/ tmp अस्तित्व की गारंटी है?


42

क्या मुझे /tmpइसके अंदर एक फ़ाइल पर लिखने से पहले जाँच और निर्माण करने की आवश्यकता है? मान लें कि कोई भी नहीं चला है sudo rm -rf /tmpक्योंकि यह बहुत दुर्लभ मामला है


16
"गारंटी" से आपका क्या तात्पर्य है? एफएचएस को इसकी आवश्यकता होती है, इसलिए किसी भी एफएचएस-अनुपालन डिस्ट्रो में यह होगा। हालांकि, कई विशेष उद्देश्य डिस्ट्रोस हैं जो एफएचएस-अनुपालन नहीं हैं। बिना / tmp के यूनिक्स / लिनक्स डिस्ट्रो बनाना निश्चित रूप से संभव है, लेकिन क्या आपको इस बारे में परवाह करने की आवश्यकता है कि आप पूरी तरह से इस बात पर निर्भर करते हैं कि आप उन सिस्टम को सपोर्ट करते हैं या नहीं।
रेयान

1
अपना स्वयं का अस्थायी डायर क्यों न बनाएं और इसे तब हटाएं जब आप इसे साफ करने के लिए अगले रिबूट पर निर्भर होने के बजाय इसके साथ कर रहे हों?
WGroleau

4
@Groleau मुझे ओपी के बारे में पता नहीं है, लेकिन मैं अपनी खुद की प्रणाली के लिए लिखी जाने वाली स्क्रिप्ट पर, मैं आमतौर पर अस्थायी फ़ाइलों को एक उपनिर्देशिका /tmp(साथ बनाया mktemp) में डालता हूं, फिर बाहर निकलने पर उस उपनिर्देशिका को हटा दें। मेरी प्रणाली का अधिकांश भाग केवल पढ़ने के लिए है और इससे मुझे cdएक योग्य निर्देशिका को याद रखने में मदद
फॉक्स

1
@Groleau मैं इसे साफ करने के लिए रिबूट पर भरोसा नहीं कर रहा हूं। mktempदिखता है वास्तव में महान, I'l शायद उस का उपयोग कर अंत।
आयुष

7
@jamesqf हाँ, रीबूटिंग को साफ़ करने की आवश्यकता नहीं है /tmp। हालाँकि, इसके विपरीत ऐसा करने की अनुमति दी गई है, और संभवतः WGroleau ने इससे बहुत अधिक अतिरिक्त लिया है। मेरा RAM में /tmpएक tmpfsआयोजन है, इसलिए यह बंद होने पर साफ हो जाता है। फिर भी, यह सिस्टम का एक विस्तार है, जो FHS द्वारा गारंटी नहीं है। इसलिए, मूल टिप्पणी के अनुसार, बूट के बीच किसी भी चीज की उपस्थिति या अनुपस्थिति पर भरोसा करना मूर्खतापूर्ण है /tmp
अंडरस्कोर_ड

जवाबों:


60

FHS जनादेश कि /tmpमौजूद हैं, के रूप में करता है POSIX ताकि आप अपने वहाँ जा रहा है पर भरोसा कर सकते (आज्ञाकारी सिस्टम पर कम से कम, लेकिन वास्तव में यह बहुत ज्यादा पर यूनिक्स सिस्टम के उपस्थित रहने की गारंटी है)। लेकिन आपको ऐसा नहीं करना चाहिए: सिस्टम व्यवस्थापक या उपयोगकर्ता अस्थायी फ़ाइलों के लिए अन्य स्थानों को पसंद कर सकते हैं। देखें कई प्लेटफार्मों पर सही tmp निर्देशिका ढूँढना अधिक जानकारी के लिए।


यह निश्चित रूप से एक डिज़ाइन विफलता है। /tmpएक नाम है। $TMPDIRदूसरा नाम है। यदि आप /tmpअस्थायी निर्देशिका के सही नाम होने पर भरोसा नहीं कर सकते हैं , तो आप $TMPDIRसही पर्यावरण चर के नाम पर भरोसा क्यों कर सकते हैं ? मुझे उस चर $TMPDIRVARका नाम पाने के लिए जाँच क्यों नहीं करनी चाहिए ? अप्रत्यक्ष का एक स्तर पर्याप्त है, और वास्तव में यही है। यह वास्तविक भंडारण के बारे में कुछ नहीं कहता है, यह सिर्फ एक नाम है। /tmp
MSalters

@MSalters इससे थोड़ा अधिक है। नामस्थान से पहले, $TMPDIRप्रत्येक उपयोगकर्ता को एक अलग अस्थायी निर्देशिका रखने की अनुमति दी जाती है, या यहां तक ​​कि विभिन्न कार्यक्रमों के लिए अलग-अलग अस्थायी निर्देशिकाओं का उपयोग करने के लिए; एक एकल /tmpप्रदान नहीं करता है (फिर से, बिना नामस्थान या कुछ समान)। खाते में लेने के लिए बहुत सारा इतिहास (या विरासत) है।
स्टीफन किट

प्रति उपयोगकर्ता एक वैध बिंदु है, लेकिन यही कारण है कि एक अच्छा डिजाइन इसके लिए उपयोग करेगा ~/tmp। जो /tmpनिश्चित रूप से अभी भी वैसा ही भौतिक स्थान हो सकता है ।
एमएसलर्स

44

व्यवहार में, /tmpअस्तित्व के लिए बहुत अधिक गारंटी है। हालाँकि, यहां तक ​​कि अगर यह मौजूद है, इसका मतलब यह नहीं है कि आपको वहाँ अस्थायी फ़ाइलें डालनी चाहिए।

मानक सम्मेलन उपयोग करने के लिए है TMPDIRवातावरण चर। यदि यह मौजूद है, तो यह अस्थायी फ़ाइलों के लिए निर्देशिका की ओर इशारा करता है। यदि यह मौजूद नहीं है, तो अस्थायी फ़ाइलें अंदर रखें /tmp

शेल स्क्रिप्ट में, आप "${TMPDIR:-/tmp}"अस्थायी फ़ाइल स्थान के रूप में उपयोग कर सकते हैं : TMPDIRयदि यह set¹ है, और /tmpअन्यथा तक के मूल्य तक फैलता है । या TMPDIRयह सशर्त रूप से उस स्थिति में सेट कर सकता है जब यह कमांड के साथ अनसेट होता है

: "${TMPDIR:=/tmp}"

और फिर अंदर अस्थायी फ़ाइलें बनाएँ "$TMPDIR"

ध्यान दें कि कोई भी एप्लिकेशन के तहत /tmpया फाइल बना सकता है $TMPDIR। इसके अलावा यह निर्देशिका उपयोगकर्ताओं के बीच साझा की जा सकती है, इसलिए आपको फ़ाइल बनाते समय अनुमतियों के बारे में ध्यान रखने की आवश्यकता है। कई प्रणालियों (लिनक्स, * बीएसडी) में एक कमांड है mktempजो सही निर्देशिका में सुरक्षित रूप से फाइलें बनाता है। यह आमतौर पर mktempअस्थायी फ़ाइलों और निर्देशिका बनाने के लिए उपयोग करने के लिए एक अच्छा विचार है - विशेष रूप से शेल स्क्रिप्ट से, जहां सहानुभूति के हमलों की संभावना के कारण एक साझा निर्देशिका में फ़ाइल को सुरक्षित रूप से बनाना असंभव है ( mkdirयदि आप त्रुटियों को सही तरीके से संभालते हैं तो ठीक है)।

¹ और गैर खाली - अगर चर रिक्त है तो यह प्रयोग करने योग्य के रूप में वैसे भी है नहीं है, और यह आम तौर पर एक अच्छा विचार है अगर वे एक फ़ाइल नाम शामिल करने के लिए माना जाता रहे एक ही तरह से खाली है या सेट चर के इलाज के लिए है।


11
शायद आप यह उल्लेख कर सकते हैं कि उपयोगकर्ताओं को फ़ाइल नाम टकरावों की उम्मीद करनी होगी। तो IMO / tmp में फाइल बनाने का एकमात्र अनुशंसित तरीका कमांड है mktempऔर इसके लिए $ TMPDIR को "स्वचालित रूप से" हैंडल करना चाहिए।
rudimeier

यही उत्तर आपको चाहिए। मैंने सिस्टम को बिना / बिन अकेले / tmp के देखा है।
जोशुआ

1
इसके अलावा A.10 निर्देशिका संरचना और उपकरण बताता है: ... /tmpPOSIX.1-2008 में ऐतिहासिक अनुप्रयोगों को बनाए रखने के लिए निर्देशिका को बरकरार रखा गया है जो इसकी उपलब्धता को मानते हैं। कार्यान्वयन को पर्यावरण चर में उपयुक्त निर्देशिका नाम प्रदान करने के लिए प्रोत्साहित किया जाता है TMPDIRऔर TMPDIRअस्थायी फ़ाइलों को बनाने के लिए सामग्री का उपयोग करने के लिए अनुप्रयोगों को प्रोत्साहित किया जाता है । ...
एंड्रयू हेनले

3
बस mktempयह पाकर दुख की बात नहीं है कि यह POSIX में नहीं है, हालांकि यह पहले से ही GNU (Linux) , OpenBSD , FreeBSD और macOS जैसे सबसे लोकप्रिय ऑपरेटिंग सिस्टम में है ।
फ्रैंकलिन यू

1
जोड़ने के लायक हो सकता है कि इसी mktempतरह के कार्य कई स्क्रिप्टिंग और प्रोग्रामिंग भाषाओं में उपलब्ध हैं, जैसे कि libc , पर्ल और पायथन
गौरव

6

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

यदि आपके पास कुछ बड़ा है, तो उपयोग करें /var/tmp/


2
मुझे यकीन नहीं है कि आगे बढ़ने से पहले उपलब्ध स्थान की जांच करने के लिए यह "यूनिक्स तरीका" है, खासकर जब से यह हमेशा ज्ञात नहीं है कि आपको कितनी जगह की आवश्यकता होगी। किसी भी स्थिति में, आपको एक त्रुटि लिखने के लिए तत्परता से तैयार रहना होगा, यदि फाइल सिस्टम पूर्ण हो जाना चाहिए; और यदि आप ऐसा करने जा रहे हैं, तो एक अग्रिम चेक करने से क्या हासिल होता है जो झूठी नकारात्मक और सकारात्मकता से ग्रस्त होगा?
नैट एल्ड्रेडगे

2
निर्भर करता है कि विफलता के मामले को आप कितनी इज्जत से संभाल सकते हैं, मुझे लगता है। मुख्य बिंदु यह नहीं मान लेना है कि /tmpबड़ी फ़ाइलों को संभाल सकता है। मान लीजिए कि यह एक मध्यम-गति लिंक पर 10GB डाउनलोड है। "यूनिक्स तरीका" या नहीं, यह पता लगाने के लिए बहुत दुखद है कि इसमें कई घंटे काम नहीं करने वाले हैं।
mattdm

1
@mattdm जल्दी जाँच करना अच्छा है लेकिन असफलता को संभालना पड़ता है। हो सकता है कि डाउनलोड शुरू होने पर tmp में 10 जीबी उपलब्ध हो, लेकिन जब आपका डाउनलोड चल रहा हो, तब कोई दूसरा उपयोगकर्ता 5 जीबी कॉपी करता है। अब क्या? हे।
ज़ैन लिंक्स

निश्चित रूप से! मैं इसका मतलब यह नहीं है कि विफलता को संभालने के बहाने के रूप में।
Mattdm

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