Thay thế tệp bằng liên kết cứng thành / dev / null


32

Tôi đang chạy một ứng dụng ghi vào log.txt. Ứng dụng đã được cập nhật lên phiên bản mới, khiến các plugin được hỗ trợ không còn tương thích. Nó buộc một số lượng lớn lỗi vào log.txt và dường như không hỗ trợ ghi vào một tệp nhật ký khác.

Làm thế nào tôi có thể viết chúng vào một bản ghi khác nhau?

Tôi đã xem xét thay thế log.txt bằng một liên kết cứng (ứng dụng không thể cho biết sự khác biệt phải không?) Hoặc một liên kết cứng trỏ đến / dev / null. Những lựa chọn của tôi là gì?


Bạn không thể chmod -w log.txt?
dùng168715

Câu trả lời:


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

Điều này sao chép thiết bị null của bạn với các số dev chính và phụ chính để log.txtbạn có cái khác null.

Các thiết bị hoàn toàn không được biết đến theo tên trong kernel mà thay vào đó là số chính và số phụ. Vì tôi không biết hệ điều hành của bạn là gì nên tôi thấy thuận tiện khi chỉ sao chép các số từ nơi chúng tôi đã biết. Nếu bạn thực hiện với số chính và số phụ sai, rất có thể bạn đã tạo một số thiết bị khác, có thể là đĩa hoặc thứ gì đó mà bạn không muốn ghi vào.


4
Điều đáng chú ý là lệnh này yêu cầu sudo(hoặc chạy như người dùng root). Vui lòng giải thích (trong câu trả lời của bạn) ý của bạn là "số dev chính và số phụ".
mkuity0

3
(Tôi không phải là OP.) Tôi đánh giá cao bản cập nhật, nhưng tôi vẫn bối rối về việc "số chính và số phụ" liên quan đến đường dẫn tệp /dev/nullnhư được sử dụng trong lệnh của bạn. Và, tôi nghĩ rằng nó sẽ giúp độc giả trong tương lai để lưu ý trong câu trả lời của bạnsudolà bắt buộc.
mkuity0

1
@wallyk: Cảm ơn, điều đó thực sự tốt để biết. Nhưng quan điểm của tôi là: Làm thế nào để đi vào chơi với sự tôn trọng cp -a /dev/null log.txtvà ý kiến ​​của tôi?
mkuity0

1
@MALON: Trên thực tế bạn đã làm, và trên Ubuntu 14.04 bạn làm cần sudođể thực hiện lệnh này, trừ khi bạn tình cờ được chạy như người sử dụng root(mà thường không được khuyến khích). Sử dụng sudo(hoặc chạy dưới dạng root) để tạo liên kết cứng (câu trả lời này) hoặc liên kết tượng trưng (câu trả lời của @ V.Michel) có thể là giải pháp phù hợp sau tất cả, nếu tệp phải được đặt ở vị trí mà bất kỳ tài khoản người dùng nào cũng có thể ghi vào, nhưng vấn đề là: hãy lưu ý yêu cầu đó một cách rõ ràng.
mkuity0

1
PS: Tôi biết rằng các bình luận lớn, nhỏ có lẽ liên quan đến một bình luận về câu hỏi khuyến nghị sử dụng mknod. Xin lưu ý rằng các nhận xét thường nhận được rất ít sự chú ý, vì vậy ai đó chỉ đọc câu hỏi và sau đó câu trả lời của bạn có thể bị nhầm lẫn (như tôi; cũng lưu ý rằng hầu hết mọi người không bao giờ tiếp xúc với các khái niệm như số thiết bị chính và phụ).
mkuity0

65

Bạn có thể tạo một liên kết tượng trưng đến / dev / null và bạn không cần phải root:

ln -s /dev/null log.txt

Điều này cũng có lợi thế là tự ghi lại tài liệu, trong đó ls -l log.txtsẽ cho thấy rằng đó là một liên kết tượng trưng đến / dev / null, thay vì dựa vào việc biết rằng ví dụ "1, 3" có ý nghĩa gì đó.
Monty Harder

14

Các câu trả lời khác ở đây có thể sẽ làm việc. Đặc biệt, giải pháp symlink có lẽ sẽ là giải pháp dễ nhất. Tôi cung cấp điều này chủ yếu cho sự hoàn chỉnh.

Các giải pháp liên quan mknod(hoặc cp -a) trở nên có vấn đề nếu hệ thống tệp chứa tệp không hỗ trợ các thiết bị (ví dụ: nó được gắn với nodevtùy chọn chẳng hạn). Và tất nhiên, các liên kết cứng trên các hệ thống tập tin đơn giản là không hoạt động.

Một thay thế cho các liên kết cứng hoặc tạo các nút thiết bị mới là sử dụng các liên kết gắn kết, cho phép bạn gắn một tệp hoặc thư mục từ một phần của cây hệ thống tệp của bạn lên một cây khác. Vì vậy, ví dụ, bạn có thể chạy:

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

Điều này hoạt động rất giống như một liên kết cứng, nhưng:

  • Nó có thể hoạt động trên các hệ thống tệp (vì nó không dựa trên các nút hệ thống tệp như một liên kết cứng)
  • Nó hoạt động trên các hệ thống tệp chỉ đọc (vì bạn không thực sự sửa đổi hệ thống tệp)

Ví dụ hoàn chỉnh:

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

Nhưng nó chỉ hoạt động trên các hệ thống có gắn kết liên kết. (Chẳng hạn như Linux hiện đại.)
Revierpost

Một tệp nhật ký sẽ không thuộc về hệ thống tệp chỉ đọc.
Monty Harder

1
Bạn sẽ ngạc nhiên về mức độ thường xuyên bạn thấy mình muốn ghi vào một tệp duy nhất trên hệ thống tệp chỉ đọc. Và nó rất có thể là trên một nodevhệ thống tập tin.
larsks

6

Nó phụ thuộc rất nhiều vào cách ứng dụng xử lý log.txt.

Nếu ứng dụng chỉ mở tệp hiện có và ghi vào tệp thì như được mô tả trong các câu trả lời khác, bạn có thể liên kết nó với / dev / null, liên kết nó ở một nơi khác, liên kết cứng ở một nơi khác (mặc dù liên kết cứng không thể là hệ thống tệp chéo nên không có ' t rất nhiều điểm trong việc này) tạo một bản sao của nút thiết bị / dev / null ở đó, v.v.

OTOH nếu ứng dụng xóa và tạo lại log.txt thì không cái nào trong số đó hoạt động. Bạn có thể liên kết toàn bộ thư mục ở một nơi khác để chuyển hướng ghi sang một hệ thống tệp khác nhưng đó là về nó và bạn sẽ phải xử lý các nội dung khác trong thư mục.

Tôi đoán nếu bạn thực sự muốn, bạn có thể tạo một hệ thống tệp lớp phủ tùy chỉnh, vượt qua hầu hết các hoạt động ngay lập tức trong khi loại bỏ mọi nỗ lực để tạo tệp có tên log.txt.


chattr +i log.txtlần đầu tiên và ứng dụng sẽ không xóa tập tin nữa.
Marco Marsala

3

Chà, một phương pháp vô duyên với ống tên là

# 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

bạn gần như có thể làm bất cứ điều gì với nhật ký bị đổ, chẳng hạn như bộ lọc hoặc gửi qua nc .


Nếu catquá trình bị giết hoặc sụp đổ, chương trình đăng nhập sẽ bị treo khi đường ống đầy.
Marco Marsala

-1

Xem xét làm cho tập tin một thiết bị null thực tế. Một tệp "log.txt" được tạo bằng mknod, với đúng loại tệp và cùng một số phụ và số chính, sẽ hoạt động như một thiết bị null bởi vì nó là.


Điều này không thêm gì vào những gì người khác đã nói.
Kusalananda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.