2010-03-26 10 views
6

Tôi đang cố gắng kiểm tra một tệp nếu nó đang mở bằng cách sử dụng lsof. Có cách nào nhanh hơn thế này không?Cách nhanh nhất khi sử dụng lsof để tìm một tệp đang mở là gì?

$result = exec('lsof | grep filename | wc -l'); 

if($result > 0) { 
    //file is open 
} 

Tôi nghĩ rằng đó phải là cách để kiểm tra một tệp nếu bạn biết tên tệp. Tất cả những gì tôi thực sự cần là đúng hay sai.

Trả lời

9

Tôi đã tìm thấy một cách tốt hơn nhiều. Với lsof (được thử nghiệm trên phiên bản 4.63), bạn có thể truy vấn trực tiếp một tệp cụ thể:

if lsof filename > /dev/null; then 
    # file is open 
fi 
2

Vâng, bạn có thể bỏ qua wc và sử dụng giá trị trả về của grep (grep trả về 0 (tức là thành công) nếu phát hiện các mô hình và 1 (tức là không-thành công) nếu nó không phát hiện các mô hình):

if lsof | grep filename > /dev/null; then 
    # filename is in output of lsof 
fi 

Bạn có thể cải thiện điều này một chút bằng cách sử dụng -l cờ grep của:

if lsof | grep -l filename > /dev/null; then 
... 

này cho grep để ngừng tìm kiếm khi nó phát hiện đó là trận đấu đầu tiên.

+0

Nếu bạn thực sự quan tâm đến quá trình đang sử dụng tệp, tốt hơn nên sử dụng tùy chọn '-m 1' cho grep để bạn thực sự có được dòng khớp thay vì tên tệp (stdin) khớp được tìm thấy. (Nếu không, sử dụng thay thế tốt đẹp của '-l'.) – Cascabel

1

Sử dụng fuser. Nó trả về không khác nếu bất kỳ tệp nào được chỉ định đang được sử dụng và không nếu chúng có sẵn.

1

Không. Câu trả lời có thể thay đổi theo thời gian bạn cố gắng làm bất cứ điều gì với kết quả. Thay vào đó, hãy thử làm bất cứ điều gì bạn định làm với tệp và xử lý lỗi "đang sử dụng" hoặc "vi phạm chia sẻ".

+0

Đối với bạn: +1, từ những gì tôi thấy tôi nghĩ bạn có thể đúng. Mặc dù câu trả lời của bạn không trả lời cụ thể câu hỏi. – jjclarkson

+0

Jared Parsons có một bài viết hay về lý do bản thân câu hỏi đó về cơ bản là thiếu sót: http://blogs.msdn.com/jaredpar/archive/2009/12/10/the-file-system-is-unpredictable.aspx Trong những trường hợp như vậy, tốt nhất là không trả lời câu hỏi mà WAS đã hỏi, nhưng câu hỏi NÊN được yêu cầu. –

+0

-1 vì một vài lý do. Thứ nhất, câu trả lời "không" là * cũng * ngây thơ và sai lầm. Có nhiều lý do hợp pháp để muốn truy vấn trực tiếp xem liệu các tệp có được mở hay các khóa cố định được giữ, như gỡ lỗi, theo dõi hoặc cảnh báo người dùng trước rằng họ có thể không lưu được các thay đổi của họ. Thứ hai, con trỏ tập tin trong Unix không áp đặt bất kỳ loại khóa theo mặc định; trừ khi bạn sử dụng 'flock' hoặc một số cơ chế khóa khác một cách rõ ràng, bạn sẽ không * nhận * bất kỳ lỗi nào" đang sử dụng "hoặc" vi phạm chia sẻ "- bạn sẽ chỉ vui vẻ thu gọn tệp của mình. –