আপনি কেন "বিড়াল / দেব / নাল> / ভের / লগ / বার্তা`?"


77

এই বাশ স্ক্রিপ্টিং উদাহরণ পৃষ্ঠায় লেখক এই স্ক্রিপ্টটি উপস্থাপন করেছেন:

# Cleanup
# Run as root, of course.

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "Log files cleaned up."

তুমি কেন cat /dev/nullকিছুতেই আছ? আমি বুঝতে পারছি না এখানে কি উদ্দীষ্ট এমন (এটা ব্যবহার করে ভালো হয় while TRUE; sleep 1; elihwজন্য {some busy program}?)। তবুও লেখক এটিকে "অস্বাভাবিক কিছু নয়" বলে অভিহিত করেছেন।

উত্তর:


41

আপনি সাধারণত cat /dev/null > [something]যখন আপনি ফাইলের সামগ্রী মুছতে চান তা নিশ্চিত করার সময় আসল ফাইলের স্থিতিতে বাধা হওয়ার একেবারে শূন্যতার ঝুঁকি রয়েছে। ফাইলটির বিষয়বস্তু স্পষ্টভাবে cat /dev/nullফাইলটি নিজেই মুছে যাবে - কারণ এটি উপস্থিত রয়েছে এবং এটি যে ফাইল সিস্টেমে থাকে তার সাথে পরিচিত still এখনও একই ইনড নম্বর, মালিকানা এবং অনুমতি নিয়ে থাকবে।

লগ ফাইলের ক্ষেত্রে, এটি হতে পারে যে লগ ফাইলটি নিজেই অন্য কোনও প্রক্রিয়া দ্বারা "ব্যবহৃত" হিসাবে চিহ্নিত হয়। সুতরাং — উদাহরণস্বরূপ doing একটি rm /var/log/messages && touch /var/log/messagesকরা অন্য প্রক্রিয়াগুলির জন্য বাধাদানকারী এবং চলমান প্রক্রিয়াগুলি দম বন্ধ করে দিতে পারে। অর্থ এমন একটি প্রক্রিয়া যা কোনওভাবে ফাইলের সাথে সংযুক্ত একটি নির্দিষ্ট ইনোড নম্বরটিতে লক /var/log/messagesহয়ে গেছে হঠাৎ আতঙ্কিত হয়ে বলতে পারে, "আরে! কী হয়েছে /var/log/messages! "ফাইলটি এখনও থাকলেও। মালিকানা এবং অনুমতিগুলি ভুলভাবে পুনরায় তৈরি করা সহ সম্ভাব্য সমস্যাগুলির উল্লেখ না করা।

কোনও ফাইলের ব্যবহার / স্থিতির এই অনিশ্চয়তার কারণে cat /dev/null > [something]সিস্টেম অ্যাডমিনরা তাদের ব্যবহার পছন্দ করে যারা একটি লগ সাফ করতে চায় তবে ইতিমধ্যে বিদ্যমান প্রক্রিয়াগুলির অপারেশনে সম্ভাব্য হস্তক্ষেপ করতে চায় না ।

এছাড়াও, পৃষ্ঠাটির প্রসঙ্গে আপনি লেখকের সাথে লিঙ্ক করেছেন:

এখানে অস্বাভাবিক কিছু নেই, কেবলমাত্র কমান্ডের একটি সেট যা কনসোলের কমান্ড-লাইন থেকে বা টার্মিনাল উইন্ডো থেকে একে একে সহজেই ডেকে আনা যেত। কমান্ডগুলি স্ক্রিপ্টে রাখার সুবিধাগুলি বার বার তাদের টাইপ না করে ছাড়িয়ে যায়।

সুতরাং লেখক যে "অস্বাভাবিক কিছু নয়" উল্লেখ করেছেন যে সেই নির্দিষ্ট বাশ স্ক্রিপ্টটি সম্পূর্ণ ধারণার সাথে সম্পর্কিত: এটি কেবলমাত্র একটি সাধারণ কমান্ডের একটি সেট যা কমান্ড লাইন থেকে সহজেই চালানো যায় তবে এতে একটি পাঠ্য ফাইলে স্থাপন করা হয় এগুলি বারবার পুনরায় টাইপ না করে এড়িয়ে চলুন।


10
@ জেলিয়াগ্র্রে কেবলমাত্র "জীবিত রাখা" হচ্ছে সেই প্রশ্নটির প্রসঙ্গ যা মূল লেখক কেন এটি করবে তা কেন্দ্রীভূত। যদি আপনি "পৌরাণিক কাহিনী" মুছে ফেলার মতানুভূতি বোধ করেন তবে দয়া করে এমন একটি উত্তর পোস্ট করুন যা মূল লেখকের কোডিং পদ্ধতির প্রসঙ্গ এবং সেইসাথে আপনি কেন বিশ্বাস করেন যে এটি অন্য পদ্ধতিতে প্রতিস্থাপন করা যেতে পারে সে সম্পর্কে দৃষ্টিভঙ্গি সরবরাহ করে।
জ্যাকগল্ড

7
@ জ্লিয়াগ্র্রে সাইরাস এর উত্তর মূল লেখক কেন এই পদ্ধতিটি ব্যবহার করেছেন বা এর পিছনে যুক্তি যুক্ত করার মূল প্রশ্নটি সম্বোধন করে না। উল্লিখিত টিউটোরিয়ালটি বেশ পুরানো এবং যুক্তিসঙ্গতভাবে গৃহীত। এটি ভুল নয় বা এটি একটি অনুমিত "শহুরে কিংবদন্তি" স্থায়ীও করে না। বরং এটি কোনও ব্যক্তির কোডের বিপরীতে অন্য ব্যক্তির কোডের উপায়। এর মত সহজ. এটি এমন একটি স্টাইল ইস্যু যার নির্ভরযোগ্যতা বা পারফরম্যান্সে কোনও নেতিবাচক প্রভাব নেই।
জ্যাকগল্ড

3
truncate -s 0একই জিনিস করতে হবে এবং কম idiomatic হবে। যাইহোক, শেল প্রোগ্রামারগুলি একটি রক্ষণশীল গোছা এবং কোনও একটির পক্ষে যথেষ্ট পুরানো সিস্টেমের মুখোমুখি হতে পারে বা কমান্ডের অভাবে যথেষ্ট ওয়াকিবই রয়েছে।
Schwern

5
@ স্কিফ্ট cat /dev/null > /foo/barফাইলটি ছাঁটাই করে; echo "" > /foo/barএটি কেটে দেয় এবং তারপরে একটি একক নিউলাইন চরিত্র লেখেন।
ডেভিড

2
আরএম ও স্পর্শের মাধ্যমে এই পদ্ধতির আর একটি সুবিধা হ'ল মালিকানা এবং অনুমতিগুলি বজায় থাকে।
jjmontes

121

আপনি কেন বিড়াল / দেব / কোনও কিছুতে নাল করবেন?

আপনি ইনোডটি অক্ষত রেখে ফাইলের বিষয়বস্তুগুলি কেটে ফেলতে পারবেন। যে সমস্ত প্রোগ্রামে ফাইলটি পড়তে বা লেখার জন্য উন্মুক্ত রয়েছে সেগুলি ফাইলের আকার শূন্যে পুনরায় সেট করা হবে তার বাইরে প্রভাবিত হবে না।

প্রায়শই পাওয়া যায় এমন একটি বোগাস বিকল্প ফাইলটি সরিয়ে আবার এটি তৈরি করে:

rm file
touch file

বা অনুরূপ:

mv file file.old
gzip file.old
touch file

সমস্যাটি হ'ল এই পদ্ধতিগুলি মুছে ফেলার সময় মুছে ফেলা ফাইলটি যে কোনও প্রক্রিয়া দ্বারা পুরানো ফাইলটিকে রেকর্ড করা থেকে বিরত রাখে না। ইউনিক্স ফাইল সিস্টেমের অধীনে থাকার কারণ, আপনি যখন কোনও ফাইল মুছে ফেলেন, আপনি কেবলমাত্র এর সামগ্রী (ইনোড) থেকে এর নাম (পাথ) লিঙ্কমুক্ত করেন। পড়া বা লেখার জন্য প্রক্রিয়াটি খোলা থাকার প্রক্রিয়া যতক্ষণ থাকবে ততক্ষণ ইনোডটি জীবন্ত রাখা হয়।

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

প্রথম পদ্ধতিটি, cat /dev/null > fileলক্ষ্যটি সঠিকভাবে অর্জন করুন তবে, একটি দৃ urban় শহুরে কিংবদন্তি সত্ত্বেও, এর cat /dev/nullঅংশটি কার্যকরভাবে কিছুই করে না। এটি একটি সিউডো ফাইল খুলবে যা ডিজাইনের দ্বারা খালি, এটি এ থেকে কিছু পড়তে ব্যর্থ হয় এবং অবশেষে সবে বের হয়। এই কমান্ডটি ব্যবহার করা কী-স্ট্রোক, বাইটস, সিস্টেম কল এবং সিপিইউ চক্রের অপচয় এবং এটি নিঃসন্দেহে দ্রুত কোনও নো-অপ্ট কমান্ড :বা এমনকি কোনও শৃঙ্খলা ছাড়াই কোনও শৃঙ্খলাবিহীন কোনও কার্যকরী পরিবর্তন ছাড়াই প্রতিস্থাপন করা যেতে পারে ।

আমাকে কতটা অকেজো cat /dev/nullতা ব্যাখ্যা করার জন্য একটি রূপকের চেষ্টা করি । ধরা যাক আপনার লক্ষ্যটি একটি গ্লাস খালি করা।

  • আপনি প্রথমে এটি থেকে কোনও তরল সরান। এটি যথেষ্ট এবং যথাযথভাবে হ'ল ( > file) আসলে পুনর্নির্দেশগুলি সর্বদা প্রক্রিয়া করা হয় given

  • তারপরে, আপনি একটি খালি বোতল বাছুন ( /dev/null) এবং খালি গ্লাসে এটি pourালা ( cat)। এটি অর্থহীন পদক্ষেপ ...

আপনি যদি আপনার লিঙ্কযুক্ত নথিটি শেষ পর্যন্ত পড়ে থাকেন তবে আপনি স্ক্রিপ্টের বর্ধিত সংস্করণ থেকে এই লাইনে থাকা মন্তব্যগুলি লক্ষ্য করতে পারেন:

    cat / dev / null> wtmp #   ':> wtmp' এবং '> wtmp' এর একই প্রভাব রয়েছে।

তাদের সত্যই আছে; cat /dev/nullকোডে খুব খারাপ রাখা হয়েছিল।

তার মানে হল যে নিম্নলিখিত কোডটি সমস্ত সাধারণ শেল (উভয় cshএবং shপরিবার) নিয়ে কাজ করবে:

cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."

এবং এই মত, বোর্ন সিনট্যাক্স ব্যবহার সব শাঁস সঙ্গে কাজ করবে ash, bash, ksh, zshএবং পছন্দগুলি:

cd /var/log
> messages
> wtmp
echo "Log files cleaned up."

তবে নোট করুন যে প্রাচীন, প্রাক-পসিক্স বোর্ন শেলগুলি সহ, এই কমান্ডগুলির মধ্যে cat /dev/nullএকটিও যদি কোনও ফাইল চালানো শেল স্ক্রিপ্ট দ্বারা পরে যুক্ত হয় তবে এটি কোনও ফাইল কেটে ফেলবে না। একটি শূন্য বাইট ফাইলের পরিবর্তে, এটির আকার অপরিবর্তিত থাকতে পারে এমন একটি স্পর্শ ফাইল। ফাইলটি এমন একটি প্রক্রিয়া দ্বারা লিখিত হয় যা অবস্থানটি অনুসন্ধান করার আগে এটি মনে করে যে এটি লেখার আগে বর্তমান।

এ ছাড়াও সাবধান যে কিছু বিকল্প সমাধান প্রায়শই একটি ফাইল কেটে ফেলার পরামর্শ দেয় যাতে ত্রুটি থাকে।

  • নিম্নলিখিত দুটি লোকই কেবল কাজটি করে না। ফলস্বরূপ ফাইলটি খালি নয় তবে খালি লাইন রয়েছে। এটি wtmpস্টোরের নির্দিষ্ট প্রস্থের রেকর্ডের মতো লগ ফাইলগুলি ভেঙে ফেলবে ।

    echo > file
    echo "" > file
  • বিএসডি shবিকল্পের উপরের পরেরটি পোর্টেবল নয়, পসিক্স প্রতিধ্বনির জন্য অনুমোদিত কোনও বিকল্প নির্দিষ্ট করে না যাতে আপনি " -n" সহ একটি লাইনযুক্ত একটি ফাইল দিয়ে শেষ করতে পারেন :

    echo -n > file
  • এটি কোনও সিস্টেম ভি shএস্কেপ ক্রম ব্যবহার করে পোর্টেবল নয় । কিছু শেল " \c" এর সাথে একটি লাইনযুক্ত একটি ফাইল তৈরি করবে :

    echo "\c" > file
  • এটি একটি কাজ করতে ডিজাইন করা একটি কমান্ড ব্যবহার করে। ইস্যুটি truncateপোর্টেবল নয় কারণ এই কমান্ডটি, পসআইএক্সএক্স দ্বারা নির্দিষ্ট নয়, এটি ইউনিক্স / লিনাক্স সিস্টেম থেকে অনুপস্থিত হতে পারে।

    truncate -s 0

অবশেষে, এখানে কয়েকটি বিকল্প রয়েছে যা পোর্টেবল এবং সঠিকভাবে কাজটি করবে:

  • স্পষ্টভাবে ফাইলটিতে একটি খালি স্ট্রিং মুদ্রণ:

    printf "" > file
  • ব্যবহার trueকমান্ড যা কঠোরভাবে নো অপ এক সমতূল্য :আরো পাঠযোগ্য যদিও:

    true > file

1
@ জোনাথনলফলার আমি বিশ্বাস করি এটি বর্তমান সমস্ত cshবাস্তবায়নের অংশ, যদিও এটি অগত্যা নথিভুক্ত হয়নি। সোলারিস csh ম্যানুয়াল পৃষ্ঠা থেকে : Null command. This command is interpreted, but performs no action.। আমি tcshম্যানুয়াল পৃষ্ঠা বা মূল বিএসডি পাতায় উভয়ের মধ্যে এর উল্লেখের কোনও উল্লেখ পাইনি cshতবে এই বাক্য গঠনটি সর্বদা কাজ করে থাকতে পারে।
jlliagre

6
লেখার একটি কারণ cat /dev/nullআপনার উদ্দেশ্যগুলি সুস্পষ্ট করা।
ডেভিডম

1
@ ডেভিডমহ এটি বোধগম্য হবে তবে আপনার বক্তব্যটি সত্য যাচাইয়ের বিরুদ্ধে প্রতিরোধ করে না। আমি সম্ভবত কয়েক দশক ধরে এই শেল আইডিয়ামটি পর্যবেক্ষণ করেছি। আমি যখন লেখকের কাছে এর পিছনে যুক্তি জিজ্ঞাসা করার সুযোগ পেয়েছি , আমি সবসময়/dev/null শূন্য বাইট ইনজেকশনের কার্যকর উপায় হিসাবে ব্যবহার করার বিষয়ে অবিরাম তত্ত্ব পেয়েছিলাম , যাইহোক ব্যবহার :বা কিছুই না করার চেয়ে আরও নির্ভরযোগ্য । এই একই পৃষ্ঠায়, সাইরাস উত্তরটি ক্ষুন্ন ছিল তবে সোজা পয়েন্টটিতে শূন্য ভোট পেয়েছিল এবং জ্যাকগল্ডের যিনি এই চ্যালেঞ্জকে চ্যালেঞ্জ cat /dev/nullজানালেন তিনি ইতিমধ্যে কমপক্ষে চারটি ভোট পেয়েছিলেন।
jlliagre

2
@ জেলিয়াগ্রে শেল সম্পর্কে আমার জ্ঞানটি বেশ মৌলিক, তাই আমি সম্ভবত সেরা জনসংখ্যার লক্ষ্য নই; তবে খালি >বা :পরিষ্কার নয় is আমি একমত যে এটি লজ্জাজনক যে এটি ব্যবহারের কারণে মিথগুলি প্রচারিত হয়েছিল।
ডেভিডম

4
@ ডেভিড্ম আপনি যদি পুনঃনির্দেশের আগে সত্যিই কিছু স্পষ্ট করতে চান তবে আমি সুপারিশ করব printf "" > fileযেটি বহনযোগ্য (পসিক্স) এবং লাইটওয়েট উভয়ই শেল বিল্টিন হিসাবে প্রায়শই প্রয়োগ করা হয়।
jlliagre

6

ফাইলটি শূন্য আকারে আনার পক্ষে এটি একটি জটিল উপায়।

cd /var/log
> messages
> wtmp
echo "Log files cleaned up."

এই সিনট্যাক্সটি প্রতিটি শেলটিতে কাজ করবে না।
পুনরায় পোস্টার

2
সঠিক। প্রশ্নটি শুধুমাত্র "বাশ" দিয়ে ট্যাগ করা আছে।
সাইরাস

@ রিনিয়ারপোস্ট এটি বোর্ন-স্টাইলের সমস্ত শেলগুলিতে কাজ করবে, তাই না? আসুন চিন্তা করবেন না csh
বারমার

: > messagesকাজ করে। :বা trueকমান্ডগুলির জন্য আরও সুস্পষ্ট পছন্দগুলি যা কোনও কিছুই প্রিন্ট করে না এবং সত্যে ফিরে আসে।
পিটার কর্ডেস

-3

একটি খোলা ফাইল ছাঁটাই করতে। এটি সমতুল্য এবং আরও বোধগম্য:

echo -n > /var/log/messages

(নতুন লাইন এড়ানোর জন্য যুক্ত করা হয়েছে)


3
এটি প্রকৃতপক্ষে আরও বোধগম্য তবে দুর্ভাগ্যক্রমে এটি একটি সমতুল্য নয়। এমনকি এটি wtmpক্ষেত্রে মত কার্যকারিতা ভঙ্গ করবে । আমার আপডেট হওয়া উত্তরটি দেখুন।
jlliagre

প্রতিধ্বনি-নিউ নিউলাইন এড়ানো।
bbaassssiiee

6
এটি সত্যই যদি আপনি ব্যবহার নিশ্চিত হন bash, -nঅন্যথায় সমস্ত বোর্ন শেলগুলিতে কাজ করার গ্যারান্টিযুক্ত নয়।
jlliagre
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.