Bạn đã có một số nhật ký ngoài tầm kiểm soát. Thay vì xóa như điên hàng ngày, hãy tìm tệp hoặc tệp đang phát triển nhanh và nhìn vào bên trong để điều tra những gì có thể gây ra điều này. Có thể một số chương trình đang quay trong một vòng lặp đăng nhập một số điều kiện. Hoặc vô hiệu hóa chương trình đó, vô hiệu hóa ghi nhật ký của nó hoặc cố gắng khắc phục tình trạng mà nó phàn nàn.
Nếu một tập tin đang phát triển trước mắt bạn và bạn không biết chương trình nào đang viết cho nó, bạn có thể dễ dàng tìm ra nó. Đây là một ví dụ. Ai đã /var/log/syslog
mở? Chúng tôi sử dụng fuser
lệnh:
# fuser /var/log/syslog
/var/log/syslog: 602
Chỉ có một quá trình đã /var/log/syslog
mở. Đó là quá trình 602. Đó là gì? Chúng ta đừng bận tâm với ps
và grep
, nhưng nhìn vào /proc
hệ thống tập tin trực tiếp:
# ls -l /proc/602/exe
lrwxrwxrwx 1 root root 0 Mar 29 17:45 /proc/602/exe -> /usr/sbin/rsyslogd
Aha, nó là vậy rsyslogd
. Chúng tôi không ngạc nhiên rằng rsyslogd
đã /var/log/syslog/
mở.
Phương pháp này không được đảm bảo để làm việc. Lý do là các chương trình không phải giữ các tệp mở ino rder để ghi cho chúng. Giả sử bạn có một quy trình mở tệp, nối vào tệp đó và sau đó đóng tệp. Bạn sẽ có một cuộc điều tra có phần khó khăn hơn. Bạn có thể chạy fuser
nhiều lần cho đến khi tình cờ bạn bắt được quá trình "bàn giao". Quá trình đó tự nó có thể đi vào và ra khỏi sự tồn tại một cách nhanh chóng. Một vấn đề khác là nhiều quy trình có thể mở tệp, nhưng chỉ có một quy trình làm cho nó lớn hơn. Trong trường hợp đó, bạn có thể theo dõi các cuộc gọi hệ thống của họ.
# fuser /var/log/huge-annoying-file
/var/log/huge-annoying-file: 1234 23459
Giáo sư! Hai quy trình đã mở: 1234 và 23459. Hãy xem họ đang làm gì:
# strace -p 1234
Process 1234 attached - interrupt to quit
select(1, NULL, NULL, NULL, {9, 922666}
Nó không làm gì cả, chỉ chặn trong một select
cuộc gọi. Ctrl-C để phá vỡ dấu vết:
select(1, NULL, NULL, NULL, {9, 922666}^C <unfinished ...>
Kiểm tra cái tiếp theo:
# strace -p 23459
write(5, "Useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
^C
Rất tiếc, người ta đang viết liên tục. Nó phải là một trong những xấu. Chúng tôi thậm chí có thể kiểm tra xem bộ mô tả tệp 5 mà quá trình đang ghi có thực sự là tệp lớn không:
# ls -l /proc/23459/fd/5
lr-x------ 1 root root 64 Apr 3 23:39 /proc/23459/fd/5 -> /var/log/huge-annoying-file
Tôi không nghi ngờ bạn có một hệ thống tập tin bị hỏng, nhưng để buộc kiểm tra đầy đủ, bạn không phải khởi động DVD.
Đầu tiên, xem lại cài đặt số lượng gắn kết tối đa của hệ thống tệp của bạn. Xác định phân vùng của bạn bằng lệnh df. Ví dụ về một hệ thống Ubuntu tôi có ở đây:
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 18062108 5499320 11645284 33% /
udev 392152 4 392148 1% /dev
tmpfs 159768 768 159000 1% /run
none 5120 0 5120 0% /run/lock
none 399416 200 399216 1% /run/shm
/dev/sr0 43668 43668 0 100% /media/VBOXADDITIONS_4.1.4_74291
Bạn có thể thấy rằng /
hệ thống tập tin được gắn kết trên /dev/sda1
. Vì thế/dev/sda1
là thiết bị lưu trữ của phân vùng root (và các phân vùng duy nhất trong hệ thống đặc biệt này).
Hãy xem xét một số thuộc tính của hệ thống tập tin đó. Điều này là an toàn để làm mặc dù nó được gắn kết. Lệnh phun ra rất nhiều đầu ra. Đây là một đoạn trích:
$ dumpe2fs /dev/sda1
dumpe2fs 1.42 (29-Nov-2011)
Filesystem volume name: <none>
Last mounted on: /
[ ... SNIP ... ]
Last mount time: Fri Mar 29 17:45:18 2013
Last write time: Tue Mar 5 09:08:03 2013
Mount count: 22
Maximum mount count: 22
[ ... SNIP ... ]
Nhìn này, số lần gắn kết bằng với số lần gắn kết tối đa. Lần sau tôi khởi động lại, sẽ có một kiểm tra hệ thống tập tin. Điều quan trọng là số lượng gắn kết là một giá trị dương. Nếu giá trị của bạn bằng 0, hãy thay đổi nó thành một số giá trị dương như 22 bằng cách sử dụngtune2fs -c 22 /dev/whatever
. Không có nghĩa là kiểm tra không bao giờ bị ép buộc bất kể bao nhiêu lần phân vùng được gắn kết. Hiếm khi hệ thống khởi động lại nên có giá trị thấp ở đây. Một máy chủ ngừng hoạt động mỗi năm một lần có thể có thể sử dụng fsck mỗi lần khởi động lại. Bạn cũng có thể đặt khoảng thời gian kiểm tra dựa trên ngày.
Bây giờ để buộc kiểm tra, bạn có thể ghi đè số lượng thực tế lớn hơn hoặc bằng mức tối đa, sau đó khởi động lại. Điều đó được thực hiện bằng vốn C
: tune2fs -C 1234 /dev/whatever
. Bây giờ phân vùng trông giống như nó đã được gắn 1234 lần mà không cần kiểm tra, lớn hơn mức tối đa một hoặc hai chữ số.
sudo du -sh /var/* ~/.xsession-errors
không? (hai nơi đó tôi dự kiến sẽ nổ tung nếu có gì đó ngớ ngẩn). Mặt khác, tôi với Eliah - đây là dấu hiệu của các vấn đề về đĩa. Hãy nghiêm túc với điều này.