র‌্যামে অস্থায়ী ফাইল কীভাবে তৈরি করবেন?


29

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা এর আউটপুটটি পাইপ করবে |tee scriptnameYYMMDD.txt। লুপের প্রতিটি চক্রের পরে আউটপুট উত্পন্ন হওয়ার পরে, আমি ফাইলের বিষয়বস্তুগুলিকে বিপরীত করব tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txtযাতে লগ আউটপুট ব্রাউজার উইন্ডোতে শীর্ষে সর্বাধিক নতুন লাইনের সাথে দৃশ্যমান হয়।

আমি সমান্তরালে এটি বেশ কয়েকটি স্ক্রিপ্ট করব। আমি ডিস্কের ক্রিয়াকলাপটি হ্রাস করার চেষ্টা করছি, তাই |tee scriptnameYYYYMMDD.txtর‍্যামডিস্ক থেকে আউটপুট সবচেয়ে ভাল। ফোল্ডারে mktempএকটি ফাইল তৈরি করে /tmp, তবে এটি অফ-ডিস্ক বলে মনে হয় না।


এটি একটি র‌্যামফস বা একটি টিএমপিএফ হওয়া প্রয়োজন (দ্বিতীয়টি ভাল)। ইতিমধ্যে আপনার সিস্টেমে এমন কোনও এফএস স্থাপন করা হয়েছে কিনা তা পরীক্ষা করুন, হ্যাঁ যদি আপনি এটি ব্যবহার করতে পারেন। যদি না হয়, আপনি এটি মাউন্ট করা প্রয়োজন।
পিটার বলেছেন 6,15 এ মনিকা

আমি আপডেট চাই 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 23: 59: 59.999 থেকে শুরু করে 00: 00-র পরিবর্তনের সম্ভাব্যতা সম্পর্কে অবগত রয়েছি: 00 কিছু ফাইলকে প্রভাবিত করতে পারে তবে সুযোগটি গ্রহণযোগ্য।
ব্যবহারকারী 208145

এটি সম্পর্কে আমার অগ্রগতি সম্পর্কে আপডেট করুন: আমার কাছে র্যামডিস্কে 1 জিবি টিএমপিএফএস ভলিউম রয়েছে। আমার কাছে এফটিপি এর মাধ্যমে ব্যবহারকারীদের হোম ফোল্ডারে ফাইল আসছে। এগুলি একটি সাবফোল্ডার / রামডিস্ক / কুইজ / এক্সআইজেড / প্রক্রিয়াতে স্থানান্তরিত হয় এবং পরে মুছে ফেলা হয়। প্রারম্ভকালে, আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা আমার প্রয়োজনীয় ডিরেক্টরি কাঠামোটিকে / ramdisk এর অধীনে পুনরায় তৈরি করে। এর ফলে আগত ফাইলগুলির জন্য সর্বনিম্ন ডিস্ক ক্রিয়াকলাপ হওয়া উচিত। এখন পর্যন্ত এই স্ক্রিপ্টগুলির জন্য ডিস্ক I / O হ্রাস করার একমাত্র অন্য উপায়টি হ'ল যে কোনও ফোল্ডার এফটিপি এর মাধ্যমে সেই ব্যবহারকারী ফোল্ডারে আসার আগে আপনি স্টার্টআপে তৈরি টিএমপিএফগুলিতে সেগুলি ব্যবহারকারীর ফোল্ডার তৈরি করতে পারেন। সবাইকে ধন্যবাদ.
ব্যবহারকারী 208145

উত্তর:


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অ root ব্যতীত অন্যান্য ব্যবহারকারীরা ব্যবহার করার অনুমতি দেয় না -tবা -o? এটি হ'ল, tmpfsযদি কোনও ডিস্ক ক্রিয়াকলাপগুলিতে সঞ্চয় করার জন্য (বা অন্য কোনও ফ্যাশনে র‌্যাম) ব্যবহার করে এমন স্ক্রিপ্টগুলি কীভাবে তৈরি করা যায় , যদি সিস্টেমে একটি উপযুক্ত ফাইল সিস্টেম উপস্থিত না থাকে?
জোনাথন ওয়াই।

একটি ভাল উত্তর না। রুট না হলে ব্যর্থ হবে।
অ্যালেক্স

11

উবুন্টু দিয়ে এটি ব্যবহার করে দেখুন:

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

3
কিভাবে স্থির হয় /run/shm/? প্রয়োজনে আমি কি chmodঅস্থায়ী ফাইলটিতে পরিবর্তনগুলি প্রয়োগ করতে পারি ? আমি লক্ষ্য করেছি যে ফোল্ডারের মোড বিটগুলি /tmpফোল্ডারের মতো। ধন্যবাদ।
ব্যবহারকারী 208145

1
অন্যান্য ডিরেক্টরি হিসাবে, /run/shm(syMLink to /dev/shm) এ উত্পন্ন ফাইলগুলিতেও (600) mktempএর একটি ডিফল্ট অনুমতি থাকে -rw-------এবং প্রয়োজনে আপনি এটি পরিবর্তন করতে পারেন sudo chmod
ক্রিসওয়েডদেভ

9

নিম্নলিখিত উত্তরগুলি এখানে এই প্রশ্নের পূর্ববর্তী উত্তরগুলি এবং তথ্য অনুসন্ধান করে আবিষ্কার করা হয়েছিল এবং সেগুলি ছাড়া পাওয়া যেত না। তাদের চুদো।

আমার লিনাক্সমিন্ট সিস্টেমে (এবং আমি বেশিরভাগ উবুন্টু ভিত্তিক সিস্টেম এবং সম্ভবত ডেবিয়ান বেসডও ধরে নিব) সেখানে একটি ব্যবহারকারীর মালিকানাধীন tmpfs স্বয়ংক্রিয়ভাবে মাউন্ট করা আছে /run/user/1000/

df -Tচেক করতে ব্যবহার করুন ।

11:41:11 জেসি @ লিম্বো: ~ f df -T
ফাইল সিস্টেমের ধরণ 1K- ব্লক ব্যবহৃত উপলভ্য ব্যবহার% মাউন্ট করা আছে
udev 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% / রান / এসএমএল
কিছুই tmpfs 102400 12 102388 1% / রান / ব্যবহারকারী
/ dev / sdb3 ext4 100861352 90755700 4959136 95% / এমএনটি / ডেটা

অধীনে /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

তারপরে আমরা এই টেম্পাইল সিস্টেমে টেম্প ফাইল এবং ডিরেক্টরি তৈরির বিকল্পের সাহায্যে mktempকমান্ডটি ব্যবহার করতে পারি --tmpdirযাতে এইভাবে র্যামে টেম্পাইলগুলি তৈরি করা যায়।

এখানে প্রদত্ত পরামর্শ অনুসরণ করে আমি প্রথমে একটি অস্থায়ী ডিরেক্টরি তৈরি করি এবং তারপরে আমার টেম্প ফাইলগুলি তৈরি করি:

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 এর পরিবর্তে ব্যবহার করা উচিত। আপনি ভেরিয়েবল vari XDG_RUNTIME_DIR ব্যবহার করে আপনার কমান্ডগুলি সরল করতে পারেন যা প্রতিটি ব্যবহারকারীর জন্য ইতিমধ্যে সঠিক ডিরেক্টরি রাখে। আরও তথ্যের জন্য, উদাহরণস্বরূপ এই উত্তরটি পরীক্ষা করুন: unix.stackexchange.com/questions/162900/…
অ্যালেক্স

1
এমকেটেম্প ওপরে এমকেস্টেপ ব্যবহার করুন !! কারণ থেকে: linux.die.net/man/3/mktemp : বিভাগে বাগ "" mktemp () এর প্রতিটি ব্যবহার একটি সুরক্ষা ঝুঁকি, রেসটি mkstemp (3) দ্বারা এড়ানো হয়েছে ""
অ্যালেক্স

0

আমি এটা বুঝতে হিসাবে, লক্ষ্য: (1) না ডিস্কে বিপরীত ফাইল সংরক্ষণ, ব্রাউজার পরিবেশিত করা (নোট: এই tmpfs, ইত্যাদি অন্যান্য উত্তর ইতিমধ্যে বিস্তারিত হতে পারে, সব); তবে, (২) ডিস্কে প্রথম টিএমপি ফাইলটি মূল আউটপুট দিয়ে লেখা এড়াতে হবে; এবং এখনও, (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 ) 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.