2012-02-26 2 views
9

Tôi đang tìm kiếm một hệ thống tệp và sử dụng grep. Tôi thấy rằng tất cả mọi thứ đang làm việc cho đến khi lỗi này xuất hiện:Grep:/proc/sysrq-trigger: Lỗi đầu vào/đầu ra

Grep: /proc/sysrq-trigger: Input/output error 

tôi đã tìm thấy thông tin ở những nơi khác nhau trên mạng, nơi những người khác đã đi qua cùng một vấn đề, nhưng không nơi nào thực sự có bất cứ điều gì mà làm việc. Tôi đã thử 2>/dev/null mà nhấn mạnh lỗi nhưng không 'bỏ qua các tập tin' mà thực sự là những gì tôi hy vọng nó sẽ làm. Thay vào đó nó chỉ dừng quá trình (đó là một quá trình tìm/sed sử dụng grep). Tôi nghĩ rằng có một cách để xác định các tập tin để loại trừ bằng cách sử dụng grep, nhưng tôi hy vọng rằng có thể có một giải pháp mạnh mẽ hơn và thanh lịch.

+0

Vì vậy, hãy sử dụng 'find $ anything! -wholename "/ proc/sysrq-trigger"? –

+0

* Tại sao * bạn có đọc tệp đệ quy trong '/ proc' không? Chúng tôi có thể giúp bạn nhiều hơn nếu bạn nói với chúng tôi những gì bạn đang cố gắng làm theo các điều khoản rộng hơn. – thkala

+0

@thkala cố gắng tìm kiếm các tệp có một chuỗi nhất định trong đó, sau đó xóa toàn bộ nội dung của tệp. – user1166981

Trả lời

16

Có vẻ như bạn đang đệ quy tìm kiếm toàn bộ hệ thống phân cấp hệ thống tệp của mình. Điều đó sẽ không hoạt động như mong đợi trên hầu hết các hệ thống.

Trên Linux ít nhất /proc/sys là các hệ thống tệp ảo - chúng không tương ứng với tệp thực trên đĩa. Các tệp đặc biệt trong /dev cũng không phải là tệp thực - chúng tương ứng với một số thiết bị trên hệ thống của bạn, chẳng hạn như đĩa cứng, thiết bị đầu vào e.t.c. Việc sửa đổi - và, đôi khi, ngay cả các tập tin đọc dưới bất kỳ thư mục nào cũng không bao giờ xảy ra theo cách không kiểm soát được, vì bạn có thể làm hỏng hạt nhân, hủy hoại hệ thống tập tin và thậm chí gây hư hỏng vĩnh viễn cho phần cứng của bạn.

Vì bạn đang sử dụng find để thực hiện tìm kiếm, bạn cần phải hạn chế phạm vi tìm kiếm của mình:

  • Sử dụng rõ ràng phủ nhận -path lựa chọn:

    find/-maxdepth 2 -type f ! -path '/proc/*' ! -path '/sys/*' 
    
  • Sử dụng tùy chọn -prune:

    find/-maxdepth 2 -path '/proc' -prune -o -path '/sys' -prune -o -type f -print 
    
  • Sử dụng tùy chọn -xdev để tránh giảm dần đến hệ thống tập tin khác hoàn toàn:

    find/-maxdepth 2 -xdev -type f 
    

Bạn có thể sử dụng như nhiều -path và/hoặc -prune tùy chọn như bạn cần phải tinh chỉnh đầu ra của find. Tuy nhiên, tôi khuyên bạn nên kiểm tra đầu ra của nó trước khi chuyển nó đến bất kỳ giai đoạn nào sau này trong đường ống.

EDIT:

Dưới đây là một số ví dụ về các thiệt hại gây ra khi truy cập vào một số tập tin một cách không kiểm soát được - thường là root:

  • Cũ hơn hạt nhân used to crash nếu /proc/kcore được đọc như root. Tôi tin rằng điều này không còn xảy ra, nhưng tôi đã gặp điều này kể từ khi /proc/kcore được giới thiệu trong loạt hạt nhân 2.4.x và nó occasionally pops up again, vì vậy tôi không có tâm trạng để thực sự thử nghiệm ...

  • Đọc thiết bị khối thông qua nút thiết bị của nó trong /dev/ có thể làm chậm bất kỳ hoạt động nào khác trên thiết bị đó, vì nó bỏ qua VFS và các bộ đệm khác nhau.Hãy tưởng tượng, ví dụ, đọc một trực tiếp RAID-5 6TB partion, trong khi các quá trình khác cố gắng sử dụng nó đúng cách thông qua hệ thống tập tin được cài đặt. Sử dụng -type f trong find nên ngăn điều này xảy ra.

  • Vì bạn đã đề cập sửa đổi, bạn có thể dễ dàng tạo thiết bị nhúng bằng cách làm hỏng phần mềm của thiết bị, có thể truy cập qua /dev/mtd*. Trong một số trường hợp nó không thể phục hồi từ tham nhũng như vậy mà không có một số biện pháp khá cực đoan.

+0

Tôi hiểu, tôi không biết bạn có thể làm hỏng nó bằng cách đọc tập tin-tôi đoán điều này là do có lẽ chặn truy cập từ các quy trình quan trọng khác? Cảm ơn các phản ứng chi tiết, nhiều đánh giá cao. Ví dụ, tôi có thể chuỗi các đường dẫn bị loại trừ khác không! -truyền '/ proc/*! -path '/ sys/*' etc? – user1166981

+0

1. Có * là * một số tệp đã từng gây ra sự cố khi đọc dưới dạng gốc. Một trong những hệ thống cũ của tôi từng bị sập khi '/ proc/kcore' được đọc - và nó sẽ khá * gây phiền nhiễu * nếu một cái gì đó cố gắng đọc thiết bị mảng RAID của tôi trực tiếp (mặc dù' -type f' nên bảo vệ chống lại điều đó ít nhất) – thkala

+0

2. Bạn không chỉ đọc, bạn đã đề cập sửa đổi. Bây giờ 'sed-i' thường ghi trên một tệp tạm thời trước khi thay thế tệp gốc, bảo vệ các tệp không thể xóa, nhưng bất kỳ phương thức nào khác có thể dễ dàng sửa đổi bản gốc gây ra * nhiều * thiệt hại. – thkala

5

grep có một tùy chọn = dir --exclude-dir mà bạn có thể sử dụng để tránh/proc và/sys

tôi đã sử dụng một lệnh như thế này thời gian gần đây, nơi tôi chỉ biết tên của một tham số Tôi dự kiến ​​sẽ được trong một số tập tin cấu hình, nhưng không có đầu mối về đường dẫn của tập tin.

cd/&& grep -rI --exclude-dir=proc --exclude-dir=sys pattern *