रैम में अस्थायी फाइल कैसे बनाएं?


29

मेरे पास एक स्क्रिप्ट है जो इसके आउटपुट को पाइप करेगी |tee scriptnameYYMMDD.txt। लूप के लिए प्रत्येक चक्र के बाद जिसमें आउटपुट उत्पन्न होता है, मैं फाइल कंटेंट को उलटा करूंगा tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txtताकि लॉग आउटपुट विंडो के शीर्ष पर सबसे नई लाइनों के साथ एक ब्राउज़र विंडो में दिखाई दे।

मेरे पास कई स्क्रिप्ट हैं जो समानांतर में ऐसा कर रही हैं। मैं डिस्क गतिविधि को कम करने की कोशिश कर रहा हूं, इसलिए |tee scriptnameYYYYMMDD.txtएक रैमडिस्क से आउटपुट सबसे अच्छा होगा। फ़ोल्डर mktempमें एक फ़ाइल बनाता है /tmp, लेकिन वह ऑफ-डिस्क प्रतीत नहीं होता है।


यह एक रम्फ या एक tmpfs होना चाहिए (दूसरा बेहतर है)। जांचें कि क्या आपके सिस्टम पर पहले से ही ऐसी एफएस लगी हुई है, यदि हां तो आप इसका उपयोग कर सकते हैं। यदि नहीं, तो आपको इसे माउंट करने की आवश्यकता है।
पीटर कहते हैं मोनिका

मैं चालू fstabकरने के लिए अपडेट करूंगा और फिर मशीन को रिबूट करूंगा । tmpfs/tmp
कास्परड

1
आप पूरी बात पर विचार करने के बजाए tailफाइलों पर गंभीर रूप से विचार कर सकते हैं (या अनुरोध पर सीजीआई के माध्यम से इसे शुरू कर सकते हैं)tac
मिकसेर

यह परीक्षण में काम करने लगता है (कम प्रारूपण के लिए खेद है): TEMPPATH="/ramdisk" LOGPATH="/var/www/html/log" ... echo <various calls to echo> | tee -a $TEMPPATH/moveKRT$(date '+%Y%m%d').txt ... लूप के लिए समाप्त होने पर, मुझे cp $TEMPPATH/moveKRT$(date '+%Y%m%d').txt $LOGPATH/moveKRT$(date '+%Y%m%d').txt tac $TEMPPATH/moveKRT$(date '+%Y%m%d').txt > $LOGPATH/moveKRT.txt पता है कि मैं miniscule संभावना से अवगत हूं कि 23: 59: 59.999 से 00:00 तक परिवर्तन: 00 कुछ फाइलों को प्रभावित कर सकता है, लेकिन मौका स्वीकार्य है।
user208145

इस पर मेरी प्रगति के बारे में अपडेट करें: मेरे पास एक 1 जीबी tmpfs वॉल्यूम / रैमडिस्क पर मुहिम शुरू की गई है। मेरे पास एफ़टीपी के माध्यम से उपयोगकर्ता होम फ़ोल्डर में आने वाली फाइलें हैं। उन्हें प्रोसेस करने के लिए सबफ़ोल्डर / रैमडिस्क / क्वीज़ / xyz / में ले जाया जाता है और बाद में डिलीट कर दिया जाता है। स्टार्टअप पर, मेरे पास एक स्क्रिप्ट है जो मेरे आवश्यक निर्देशिका ढांचे को / रैमडिस्क के तहत फिर से बनाता है। यह आने वाली फ़ाइलों के लिए न्यूनतम डिस्क गतिविधि में परिणाम होना चाहिए। अब तक इन लिपियों के लिए डिस्क I / O को कम करने का एकमात्र दूसरा तरीका यह है कि स्टार्टअप पर बनाए गए tmpfs में उन उपयोगकर्ता फ़ोल्डर को बनाना होगा, इससे पहले कि कोई फ़ाइल उन उपयोगकर्ता फ़ोल्डर में FTP के माध्यम से आती है। सबको शुक्रीया।
user208145

जवाबों:


22

आप एक tmpfsविभाजन को माउंट कर सकते हैं और वहां फाइल लिख सकते हैं:

mount -t tmpfs -o size=500m tmpfs /mountpoint

यह विभाजन अब 500 एमबी तक सीमित है। यदि आपकी अस्थायी फ़ाइल 500 एमबी से बड़ी हो जाती है तो एक त्रुटि होगी no space left on device:। लेकिन, इससे कोई फर्क नहीं पड़ता कि आप अपने सिस्टम रैम की तुलना में अधिक मात्रा में स्पेस निर्दिष्ट करते हैं। tmpfsस्वैप स्थान का भी उपयोग करता है, इसलिए आप सिस्टम क्रैश को विरोध नहीं कर सकते, जैसा कि विरोध किया गया है ramfs

अब आप अपनी फ़ाइल को इसमें लिख सकते हैं /mountpoint:

command | tee /mountpoint/scriptnameYYYYMMDD.txt

3
size=[num]%यह भी ठीक है - एक tmpfs उपलब्ध मेमोरी के प्रतिशत तक सीमित हो सकता है। यह आमतौर पर उस तरह से आसान होता है अगर कमांड हमेशा एक ही (वास्तविक / आभासी) मशीन के लिए लक्षित नहीं होते हैं । इसके अलावा काम यह है कि एक tmpfs सामग्री w / को नहीं छोड़ता है -o remount,size=newsize
मिकसेर

1
चूँकि यह सवाल एक बैश स्क्रिप्ट के इर्द-गिर्द घूमता है, जिसे मानने का कोई कारण हमारे पास नहीं है, तो क्या आप यह बता सकते हैं कि क्या आप यह बता सकते हैं कि mountगैर-रूट उपयोगकर्ताओं को उपयोग करने की अनुमति नहीं है -tया नहीं -o? यही है, tmpfsकोई डिस्क का संचालन करने के लिए स्क्रिप्ट का उपयोग कैसे कर सकता है (या किसी अन्य फैशन में रैम), अगर एक उपयुक्त फाइल सिस्टम पहले से ही सिस्टम पर मौजूद नहीं है?
जोनाथन वाई।

अच्छा जवाब नहीं। अगर आप जड़ नहीं हैं तो असफल हो जाएंगे।
एलेक्स

11

Ubuntu के साथ यह कोशिश करें:

ramtmp="$(mktemp -p /dev/shm/)"
tac scriptnameYYYYMMDD.txt > "$ramtmp"

3
कितना स्थिर लेखन है /run/shm/? क्या chmodजरूरत पड़ने पर मैं अस्थायी फाइल में परिवर्तन लागू कर सकता हूं ? मैंने देखा कि फ़ोल्डर के मोड बिट्स फ़ोल्डर के समान हैं /tmp। धन्यवाद।
user208145

1
अन्य निर्देशिकाओं की तरह, /run/shm(सिमलिंक /dev/shm) से उत्पन्न फ़ाइलों में mktempभी -rw-------(600) की डिफ़ॉल्ट अनुमति होती है और जरूरत पड़ने पर आप इसे बदल सकते हैं sudo chmod
क्रिशवेबदेव

9

निम्नलिखित जवाब पिछले जवाब और इस सवाल में जानकारी की जांच कर रही द्वारा की खोज की थी यहाँ और उनके बिना नहीं पाया गया होता। उन्हें Cudos।

मेरे linuxmint सिस्टम पर (और मैं सबसे ubuntu आधारित सिस्टम और संभवतः डेबियन आधारित भी मानूंगा) एक उपयोगकर्ता के स्वामित्व वाला tmpfs है जो स्वचालित रूप से घुड़सवार है /run/user/1000/

df -Tजाँच करने के लिए उपयोग करें।

11:41:11 जेसे @ लिम्बो: ~ $ df -T
फाइलसिस्टम टाइप 1K- ब्लॉक प्रयुक्त उपलब्ध%% का उपयोग किया जाता है
udv devtmpfs 15904812 4 15904808 1% / देव
tmpfs tmpfs 3184120 1700 3182420 1% / रन
/ dev / sdb2 ext4 14248880 11464788 2037240 85% /
कोई नहीं tmpfs 4 0 4 0% / sys / fs / cgroup
कोई नहीं tmpfs 5120 0 5120 0% / रन / लॉक
कोई नहीं tmpfs 15920584 848 15919736 1% / रन / shm
कोई नहीं tmpfs 102400 12 102388 1% / रन / उपयोगकर्ता
/ dev / sdb3 ext4 100861352 90755700 4959136 95% / mnt / डेटा

इसके तहत /run/user/सिस्टम पर प्रत्येक सामान्य उपयोगकर्ता के लिए एक निर्देशिका है

12:07:35 jesse@Limbo:~$ ls -l /run/user
total 0
drwx------ 2 root  root   40 Aug  7 09:50 0
drwx------ 8 jesse jesse 180 Aug  7 11:38 1000

इन निर्देशिकाओं को उनके संबंधित उपयोगकर्ता के आईडी के नाम पर रखा गया है। हम इस आदेश पर विवरण के लिए id -uदेखने man idके साथ उपयोगकर्ता आईडी प्राप्त कर सकते हैं ।

12:07:43 jesse@Limbo:~$ ls -l /run/user/$(id -u)
total 0
drwx------ 2 jesse jesse  60 Aug  7 09:50 dconf
dr-x------ 2 jesse jesse   0 Aug  7 09:50 gvfs
drwx------ 2 jesse jesse  80 Aug  7 09:50 pulse
lrwxrwxrwx 1 root  root   17 Aug  7 09:50 X11-display -> /tmp/.X11-unix/X0

फिर हम इस tempfilesystem में अस्थायी फ़ाइलों और निर्देशिकाओं को बनाने mktempके --tmpdirविकल्प के साथ कमांड का उपयोग कर सकते हैं और इस प्रकार RAM में tempfiles बना सकते हैं।

यहां दी गई सलाह के बाद मैं पहले एक अस्थायी निर्देशिका बनाता हूं और फिर उसमें अपनी अस्थायी फाइलें बनाता हूं:

mydir=$(mktemp -dt "$(basename $0).XXXXXXXX" --tmpdir=/run/user/$(id -u))

/run/user/1000/bash.w42BYxbG/फिर एक अस्थायी निर्देशिका बनाने के लिए

myfile=$(mktemp -t "$(basename $0).XXXXXXXX" --tmpdir=$mydir)

इसमें एक गतिरोध पैदा करना।

यह इन फ़ाइल को साफ करना आसान बनाता है क्योंकि मुझे केवल इतना करना है rm -r $mydir

डिफ़ॉल्ट रूप से ये सभी फाइलें केवल उस उपयोगकर्ता के स्वामित्व और पठनीय हैं, जिन्होंने उन्हें बनाया है।

नोट: $(basename $0)कमांड का वह भाग स्क्रिप्ट / प्रक्रिया का नाम निकालता है जिसने mktemp निष्पादित किया है। यदि मेरे पास एक स्क्रिप्ट है /home/jesse/scripts/myScript.shतो इस स्क्रिप्ट द्वारा निष्पादित होने पर $(basename $0)वापस आती है myScript.sh। इस प्रकार उपरोक्त आदेश क्रमशः बनाएंगे /run/user/1000/myScript.sh.w42BYxbG/और /run/user/1000/myScript.sh.w42BYxbG/myScript.sh.BCzSmq06बनाए जाएंगे।


/run/user/1000प्रत्येक लिनक्स पर उपलब्ध है जो सिस्टमड का उपयोग करता है, इसलिए यह न केवल डेबियन-आधारित सिस्टम पर उपलब्ध है, बल्कि अधिकांश अन्य लिनक्स वितरणों पर भी उपलब्ध है। यदि नहीं, तो इसके बजाय / tmp का उपयोग किया जाना चाहिए। आप चर $ XDG_RUNTIME_DIR का उपयोग करके अपनी आज्ञाओं को सरल बना सकते हैं जो पहले से ही प्रत्येक उपयोगकर्ता के लिए सही निर्देशिका रखता है। अधिक जानकारी के लिए, इस उत्तर को जांचें
एलेक्स

1
Mktemp पर mkstemp का उपयोग करें !! कारण से: linux.die.net/man/3/mktemp : अनुभाग में कीड़े ... "mktemp () का हर उपयोग एक सुरक्षा जोखिम है, दौड़ mkstemp (3) से बचा जाता है।"
एलेक्स

0

जैसा कि मैं इसे समझता हूं, लक्ष्य हैं: (1) उलटी फ़ाइल को डिस्क पर स्टोर करना , ब्राउज़र को परोसा जाना (नोट: यह tmpfs आदि हो सकता है, क्योंकि अन्य सभी उत्तर पहले से ही विस्तार से हैं); लेकिन, (2) मूल उत्पादन के साथ डिस्क पर पहली tmp फ़ाइल लिखने से बचें; और फिर भी, (3) अभी भी मूल आउटपुट को स्टडआउट में प्रदर्शित करता है।

यदि ऐसा है, तो निम्नलिखित आपकी आवश्यकताओं को पूरा कर सकता है, बैश प्रक्रिया प्रतिस्थापन (यानी, मूल रूप से एक नामित पाइप) का उपयोग करके :

command | tee >( tac > /var/www/html/logs/scriptname.txt )

ध्यान दें कि यह स्टडआउट करने के लिए लगातार प्रिंटिंग आउटपुट है, और जब कमांड समाप्त होता है (जब आपका लूप समाप्त हो जाता है), तो उस आउटपुट को उलट कर आउटपुट फाइल पर लिख देता है। निम्नलिखित के माध्यम से सचित्र, जो प्रति सेकंड एक लाइन प्रिंट करता है, और समाप्ति के बाद फ़ाइल /tmp/foo.txtमें उलट लाइनें होती हैं:

i=0
while [ $i -lt 10 ]; do
    ((i = i+1))
    echo "==$i== $(date)"
    sleep 1
done | tee >( tac >> /tmp/foo.txt ) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.