แทนที่ไฟล์ด้วยฮาร์ดลิงก์ไปที่ / dev / null


32

ฉันใช้งานแอปพลิเคชันที่เขียนไปยัง log.txt แอพนี้ได้รับการอัพเดตเป็นเวอร์ชั่นใหม่ทำให้ปลั๊กอินที่รองรับไม่รองรับอีกต่อไป มันบังคับให้เกิดข้อผิดพลาดจำนวนมหาศาลใน log.txt และดูเหมือนจะไม่สนับสนุนการเขียนไปยังไฟล์บันทึกอื่น

ฉันจะเขียนพวกเขาไปยังบันทึกอื่นได้อย่างไร

ฉันได้พิจารณาแทนที่ log.txt ด้วยฮาร์ดลิงก์ (แอปพลิเคชันไม่สามารถบอกความแตกต่างได้ใช่ไหม) หรือฮาร์ดลิงก์ที่ชี้ไปที่ / dev / null ตัวเลือกของฉันคืออะไร?


คุณทำไม่ได้chmod -w log.txtเหรอ
user168715

คำตอบ:


30
# cp -a /dev/null log.txt

สำเนานี้โทรศัพท์ null คุณมีสิทธิหมายเลข dev ใหญ่และรายย่อยเพื่อให้คุณมีอีกlog.txtnull

อุปกรณ์จะไม่รู้จักโดยใช้ชื่อในเคอร์เนล แต่จะใช้ชื่อหลักและรอง เนื่องจากฉันไม่ทราบว่าคุณใช้ระบบปฏิบัติการรุ่นใดฉันพบว่าการคัดลอกตัวเลขจากที่เรารู้อยู่แล้วนั้นสะดวกสบาย หากคุณทำด้วยหมายเลขหลักและรองที่ไม่ถูกต้องคุณอาจจะทำอุปกรณ์อื่น ๆ บางทีดิสก์หรืออย่างอื่นที่คุณไม่ต้องการเขียน


4
เป็นที่น่าสังเกตว่าคำสั่งนี้ต้องการ sudo(หรือเรียกใช้ในฐานะผู้ใช้รูท) โปรดอธิบาย (ในคำตอบของคุณ) สิ่งที่คุณหมายถึงโดย "หมายเลข dev หลักและรองที่ถูกต้อง"
mklement0

3
(ฉันไม่ใช่ OP) ฉันขอขอบคุณการอัปเดต แต่ฉันยังคงสับสนเกี่ยวกับความสัมพันธ์ระหว่าง "เส้นทางหลักและหมายเลขรอง" /dev/nullตามที่ใช้ในคำสั่งของคุณ และฉันคิดว่ามันจะช่วยให้ผู้อ่านในอนาคตได้จดบันทึกคำตอบของคุณที่sudoจำเป็น
mklement0

1
@wallyk: ขอบคุณจริงๆที่รู้ดี แต่ประเด็นของฉันคือ: การเล่นด้วยความเคารพcp -a /dev/null log.txtและความคิดเห็นของฉันได้อย่างไร?
mklement0

1
@MALON: แท้จริงที่คุณทำและบน Ubuntu 14.04 คุณไม่ต้องการsudoที่จะดำเนินการคำสั่งนี้ถ้าคุณเกิดขึ้นที่จะทำงานตามที่ผู้ใช้root(ซึ่งเป็นกำลังใจทั่วไป) การใช้sudo(หรือทำงานตามroot) เพื่อสร้างการเชื่อมโยงอย่างหนัก (คำตอบนี้) หรือลิงก์สัญลักษณ์ (@ คำตอบของ V.Michel) อาจจะเป็นทางออกที่เหมาะสมหลังจากทั้งหมดถ้าไฟล์จะต้องอยู่ในสถานที่ใด ๆบัญชีผู้ใช้สามารถเขียนไป แต่ประเด็นคือ: โปรดทราบว่าความต้องการอย่างชัดเจน
mklement0

1
PS: ฉันรู้ว่าเห็นว่าสำคัญ, ความเห็นเล็ก ๆ น้อย ๆ อาจจะเกี่ยวข้องกับความคิดเห็นmknodในคำถามแนะนำการใช้งานของ โปรดทราบว่าความคิดเห็นมักได้รับความสนใจน้อยดังนั้นบางคนที่อ่านคำถามนี้เท่านั้นและจากนั้นคำตอบของคุณอาจสับสน (เช่นเดียวกับฉันด้วยโปรดทราบว่าคนส่วนใหญ่ไม่เคยสัมผัสกับแนวคิดเช่นหมายเลขอุปกรณ์หลักและรอง)
mklement0

65

คุณสามารถสร้างลิงก์สัญลักษณ์ไปที่ / dev / null และคุณไม่จำเป็นต้องรูท:

ln -s /dev/null log.txt

สิ่งนี้ยังมีข้อดีของการทำเอกสารด้วยตนเองซึ่งls -l log.txtจะแสดงให้เห็นว่ามันเป็น symlink ไปยัง / dev / null แทนที่จะพึ่งพาการรู้ว่าเช่น "1, 3" นั้นมีความสำคัญ
Monty Harder

14

คำตอบอื่น ๆ ที่นี่อาจทำงานได้ โดยเฉพาะอย่างยิ่งโซลูชัน symlink น่าจะเป็นทางออกที่ง่ายที่สุด ฉันเสนอสิ่งนี้เพื่อความสมบูรณ์เป็นหลัก

วิธีแก้ปัญหาที่ไม่เกี่ยวข้องmknod(หรือcp -a ) กลายเป็นปัญหาหากระบบไฟล์ที่มีไฟล์ไม่รองรับอุปกรณ์ (เช่นถูกประกอบเข้ากับnodevตัวเลือกเป็นต้น) และแน่นอนว่าการเชื่อมโยงอย่างหนักในระบบไฟล์ก็ใช้งานไม่ได้

อีกทางเลือกหนึ่งสำหรับฮาร์ดลิงก์หรือสร้างโหนดอุปกรณ์ใหม่คือการใช้ bind mounts ซึ่งช่วยให้คุณเมาท์ไฟล์หรือไดเรกทอรีจากส่วนหนึ่งของโครงสร้างระบบไฟล์ของคุณไปยังอีกส่วนหนึ่ง ตัวอย่างเช่นคุณสามารถเรียกใช้:

mount -o bind /dev/null /path/to/log.txt

มันทำหน้าที่เหมือนลิงค์หนัก แต่:

  • มันสามารถทำงานข้ามระบบไฟล์ (เพราะมันไม่ได้ขึ้นอยู่กับระบบไฟล์ inodes เช่นการเชื่อมโยงอย่างหนัก)
  • ใช้งานได้กับระบบไฟล์แบบอ่านอย่างเดียว (เพราะคุณไม่ได้แก้ไขระบบไฟล์)

สำหรับตัวอย่างที่สมบูรณ์:

bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log

แต่ใช้งานได้กับระบบที่มีการผูกติดเท่านั้น (เช่น Linux ที่ทันสมัย)
reinierpost

ไฟล์บันทึกจะไม่อยู่ในระบบไฟล์แบบอ่านอย่างเดียวอยู่แล้ว
Monty Harder

1
คุณจะประหลาดใจที่คุณพบว่าตัวเองต้องการเขียนไฟล์เดียวบนระบบไฟล์แบบอ่านอย่างเดียว และมันอาจจะเป็นnodevระบบไฟล์ได้เป็นอย่างดี
larsks

6

มันขึ้นอยู่กับช่วงเวลาสำคัญว่าแอปพลิเคชันจัดการ log.txt ได้อย่างไร

หากแอปพลิเคชันเพิ่งเปิดไฟล์ที่มีอยู่และเขียนลงไปแล้วตามที่อธิบายไว้ในคำตอบอื่น ๆ คุณสามารถเชื่อมโยงไปยัง / dev / null เชื่อมโยงไปที่อื่นฮาร์ดลิงก์ที่อื่น (แม้ว่าฮาร์ดลิงก์จะไม่สามารถข้ามระบบไฟล์ได้) ไม่มากในประเด็นนี้) สร้างสำเนาของโหนดอุปกรณ์ / dev / null ที่นั่นเป็นต้น

OTOH ถ้าแอปพลิเคชันลบและสร้าง log.txt ใหม่จะไม่ทำงาน คุณสามารถเชื่อมโยงไดเรคทอรีทั้งหมดกับที่อื่นเพื่อเปลี่ยนเส้นทางการเขียนไปยังระบบไฟล์ที่แตกต่างกัน แต่นั่นเป็นเรื่องเกี่ยวกับมันและคุณจะต้องจัดการกับสิ่งอื่น ๆ ในไดเรกทอรี

ฉันเดาว่าคุณต้องการคุณสามารถสร้างระบบไฟล์ซ้อนทับแบบกำหนดเองที่ผ่านการดำเนินการส่วนใหญ่ไปได้ทันทีในขณะที่ละทิ้งความพยายามในการสร้างไฟล์ชื่อ log.txt


chattr +i log.txtครั้งแรกและแอปพลิเคชันจะไม่ลบไฟล์อีกต่อไป
Marco Marsala

3

ทีนี้วิธีการหนึ่งที่ไม่ได้รับความนิยมด้วยการระบุชื่อ pipe:

# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null

คุณเกือบจะสามารถทำอะไรกับบันทึกที่ถูกทิ้งเช่นตัวกรองหรือส่งผ่านncอร์ทแคโรไลนา


หากcatกระบวนการถูกฆ่าหรือหยุดทำงานโปรแกรมล็อกอินจะหยุดทำงานเมื่อไพพ์เต็ม
Marco Marsala

-1

พิจารณาสร้างไฟล์เป็นอุปกรณ์ null จริง ไฟล์ "log.txt" ที่สร้างด้วย mknod ด้วยประเภทไฟล์ที่ถูกต้องและหมายเลขรองและหมายเลขหลักเดียวกันจะทำหน้าที่เป็นอุปกรณ์ที่ว่างเปล่าเนื่องจากเป็น


สิ่งนี้ไม่ได้เพิ่มสิ่งที่ผู้อื่นพูดไปแล้ว
Kusalananda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.