টি এল; ডিআর
অ্যাপড মোডে আপনার লগ ফাইলটি খুলুন :
cmd >> log
তারপরে, আপনি এটির সাথে নিরাপদে এটি কেটে ফেলতে পারেন:
: > log
বিস্তারিত
বোর্ন-এর মতো শেল দিয়ে, ফাইলটি লেখার জন্য খোলা যেতে পারে এমন 3 টি প্রধান উপায় রয়েছে। কেবল লেখার ক্ষেত্রে ( >), পড়ুন + লিখুন ( <>) অথবা অ্যাপড (এবং কেবলমাত্র লেখার জন্য >>) মোড।
প্রথম দুই, কার্নেল বর্তমান অবস্থান আপনি মনে (আপনার, আমি বলতে চাচ্ছি, খোলা ফাইল বিবরণ , সমস্ত ফাইল বর্ণনাকারী যে সদৃশ অথবা এক আপনার উপর ফাইল খোলা থেকে forking দ্বারা এটি উত্তরাধিকারসূত্রে করেছে ভাগ করে নেওয়া) আছে সেগুলিও ফাইল।
যখন তুমি কর:
cmd > log
logস্ট্যান্ডআউটের জন্য শেল দ্বারা কেবল লেখার মোডে খোলা আছে cmd।
cmd(এটির প্রাথমিক প্রক্রিয়াটি শেল এবং সমস্ত সম্ভাব্য বাচ্চাদের দ্বারা উদ্ভূত হয়েছিল) তাদের স্টাডআউটে লেখার সময়, কার্সার অবস্থানে লিখুন যে ফাইলটি তারা যে ফাইলটিতে ভাগ করে থাকে তার উন্মুক্ত ফাইলের বিবরণ দিয়ে থাকে।
উদাহরণস্বরূপ, যদি cmdপ্রাথমিকভাবে লেখেন zzzতবে পজিশনটি ফাইলে 4 টি অফসেটে থাকবে এবং পরের বার cmdবা তার শিশুরা ফাইলে লিখবে, সেখানে ফাইলটি বড় হওয়া বা ব্যবধানে সঙ্কুচিত কিনা তা নির্বিশেষে ডেটা লেখা হবে ।
যদি ফাইলটি সঙ্কুচিত হয়ে থাকে, উদাহরণস্বরূপ যদি এটি একটি দিয়ে কাটা হয়েছে
: > log
এবং cmdলিখেছেন xx, সেগুলি xxঅফসেটে লেখা হবে 4এবং প্রথম 3 টি অক্ষর NUL অক্ষর দ্বারা প্রতিস্থাপিত হবে।
$ exec 3> log # open file on fd 3.
$ printf zzz >&3
$ od -c log
0000000 z z z
0000003
$ printf aaaa >> log # other open file description -> different cursor
$ od -c log
0000000 z z z a a a a
0000007
$ printf bb >&3 # still write at the original position
$ od -c log
0000000 z z z b b a a
0000007
$ : > log
$ wc log
0 0 0 log
$ printf x >&3
$ od -c log
0000000 \0 \0 \0 \0 \0 x
0000006
এর অর্থ আপনি কেবলমাত্র রাইটিং-মোডে খোলা একটি ফাইলকে ছাঁটাই করতে পারবেন না (এবং এটি পড়ার + লেখার জন্য একই ) যেমনটি আপনি করেন, ফসলে ফাইল বর্ণনাকারী ফাইল খোলা প্রসেসগুলি NUL অক্ষর ছেড়ে দেবে ফাইল (ওএস / এক্স ব্যতীত এগুলি সাধারণত ডিস্কে স্থান নেয় না, যদিও তারা স্পার্স ফাইল হয়ে যায়)।
পরিবর্তে (এবং আপনি বেশিরভাগ অ্যাপ্লিকেশনগুলি লক্ষ্য করবেন যে তারা যখন লগ ফাইল লিখবেন ) তখন আপনার ফাইলটি অ্যাপেন্ড মোডে খোলা উচিত :
cmd >> log
অথবা
: > log && cmd >> log
যদি আপনি একটি খালি ফাইল শুরু করতে চান।
অ্যাপেন্ড মোডে, সমস্ত লেখাগুলি ফাইলের শেষে তৈরি করা হয়েছিল, শেষ লেখার স্থানটি যেখানেই ছিল তা নির্বিশেষে:
$ exec 4>> log
$ printf aa >&4
$ printf x >> log
$ printf bb >&4
$ od -c log
0000000 a a x b b
0000005
$ : > log
$ printf cc >&4
$ od -c log
0000000 c c
0000002
এটি আরও নিরাপদ যেমন দুটি প্রক্রিয়া ভুল করে ফাইলটি (সেইভাবে) ফাইলটি খোলে (উদাহরণস্বরূপ যদি আপনি একই ডেমনের দুটি উদাহরণ শুরু করেছেন), তাদের আউটপুট একে অপরকে ওভাররাইট করবে না।
লিনাক্সের সাম্প্রতিক সংস্করণগুলিতে আপনি বর্তমান অবস্থান এবং ফাইল ফাইল বিবরণকারী অ্যাপেন্ড মোডে খোলা আছে কিনা তা যাচাই করে দেখতে পারেন /proc/<pid>/fdinfo/<fd>:
$ cat /proc/self/fdinfo/4
pos: 2
flags: 0102001
বা সাথে:
$ lsof +f G -p "$$" -ad 4
COMMAND PID USER FD TYPE FILE-FLAG DEVICE SIZE/OFF NODE NAME
zsh 4870 root 4w REG 0x8401;0x0 252,18 2 59431479 /home/chazelas/log
~# lsof +f g -p "$$" -ad 4
COMMAND PID USER FD TYPE FILE-FLAG DEVICE SIZE/OFF NODE NAME
zsh 4870 root 4w REG W,AP,LG 252,18 2 59431479 /home/chazelas/log
এই পতাকাগুলি ও ..._ ফ্ল্যাগগুলির সাথে openসিস্টেম কলে পাস করেছে ।
$ gcc -E - <<< $'#include <fcntl.h>\nO_APPEND O_WRONLY' | tail -n1
02000 01
( O_APPEND0x400 বা অষ্টাল 02000)
শেল তাই >>সাহায্যে ফাইল খোলে O_WRONLY|O_APPEND(এবং 0100000 এখানে O_LARGEFILE যা এই প্রশ্নের প্রাসঙ্গিক নয় হয়) যখন >হয় O_WRONLYশুধুমাত্র (এবং <>হল O_RDWRশুধুমাত্র)।
আপনি যদি এটি করেন:
sudo lsof -nP +f g | grep ,AP
এতে খোলা ফাইলগুলির সন্ধান O_APPENDকরতে, আপনি বর্তমানে আপনার সিস্টেমে লেখার জন্য বেশিরভাগ লগ ফাইলগুলি খোলা পাবেন।