टी एल; डॉ
अपनी लॉग फ़ाइल को एपेंड मोड में खोलें :
cmd >> log
फिर, आप इसे सुरक्षित रूप से काट सकते हैं:
: > log
विवरण
बॉर्न-जैसे शेल के साथ, 3 मुख्य तरीके हैं जो एक फ़ाइल लिखने के लिए खुले हो सकते हैं। में लिखने केवल ( >), पढ़ा + लिखने ( <>) या संलग्न (और लिखने-ही, >>) मोड।
पहले दो में, कर्नेल आपके द्वारा वर्तमान स्थिति को याद करता है (आपके द्वारा, मेरा मतलब है, खुली हुई फ़ाइल का विवरण , सभी फ़ाइल विवरणकर्ताओं द्वारा साझा किया गया है, जो आपके द्वारा फ़ाइल खोले जाने के बाद उसे फोर्क करके विरासत में मिला है)। फ़ाइल।
जब तुम करोगे:
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
वे झंडे O ..._ झंडे openसिस्टम कॉल के लिए दिए गए हैं।
$ gcc -E - <<< $'#include <fcntl.h>\nO_APPEND O_WRONLY' | tail -n1
02000 01
( O_APPEND0x400 या अष्टकोणीय 02000)
खोल के तो >>साथ फ़ाइल को खोलता है O_WRONLY|O_APPEND(और 0,100,000 यहाँ O_LARGEFILE जो इस प्रश्न के लिए प्रासंगिक नहीं है), जबकि >है O_WRONLYकेवल (और <>है O_RDWRकेवल)।
यदि आप एक:
sudo lsof -nP +f g | grep ,AP
फाइलों को खोजने के लिए O_APPEND, आपको अपने सिस्टम पर लिखने के लिए वर्तमान में खुली हुई अधिकांश लॉग फाइलें मिलेंगी।