Làm thế nào để liệt kê các quá trình khóa tập tin?


51

Sử dụng flock, một số quy trình có thể có khóa chia sẻ cùng một lúc hoặc đang chờ để có được khóa ghi. Làm thế nào để tôi có được một danh sách các quá trình này?

Đó là, đối với một tệp X đã cho, lý tưởng nhất là tìm id tiến trình của từng tiến trình đang giữ hoặc đang chờ, khóa trên tệp. Nó sẽ là một khởi đầu rất tốt mặc dù chỉ cần đếm số lượng quá trình đang chờ khóa.

Câu trả lời:


42

lslocks, từ gói linux-linux , thực hiện chính xác điều này.

Trong MODEcột, các quy trình chờ khóa sẽ được đánh dấu bằng a *.


3
Apt-cache nói rằng linux-linux đã là phiên bản mới nhất (2.20.1-1ubfox3), nhưng tôi không có lslocks; Có một repo tôi có thể sử dụng sẽ cung cấp cho tôi?
Benubird

2
Có vẻ như điều này đã được thêm vào trong 2.22, vì vậy phiên bản của Ubuntu quá cũ. Có lẽ một phiên bản mới sẽ có sẵn cuối cùng. (Đây cũng là trường hợp với RHEL 6 hoặc CentOS.) Bạn có thể tự xây dựng nó hoặc bạn có thể sử dụng lsofphương pháp mà Joel Davis gợi ý.
mattdm

6
lslocksđọc /proc/locks, trong một nhúm bạn có thể tự đọc trực tiếp, với lời cảnh báo rằng các tệp được xác định bởi thiết bị và inode chứ không phải tên. Vì bạn biết tập tin, nên không có vấn đề gì. Các mục bị chặn có ->tiền tố trước cột loại khóa (do đó thêm một cột vào dòng đó).
mr.spuratic

27

Hai khả năng: lsof(sở thích của tôi) hoặc lslk(cụ thể đối với khóa tệp):

[root@policyServer ~]# lslk | grep "master.lock"
SRC          PID   DEV  INUM   SZ TY M   ST WH  END LEN NAME
master      1650 253,0 12423   33  w 0    0  0    0   0 /var/lib/postfix/master.lock

[root@policyServer ~]# lsof | grep "master.lock"
master     1650      root   10uW     REG              253,0       33      12423 /var/lib/postfix/master.lock

Đầu ra của lslk là tự mở rộng nhưng lsofđặt mô tả khóa vào cột "FD" ( 10uWở trên). Từ trang người đàn ông:

The mode character is followed by one of these lock characters, describing the type of lock applied to the file:

N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part      of the file;
X for an SCO OpenServer Xenix lock on the      entire file;
                       space if there is no lock.

Vì vậy, cột "FD" lsofở trên chia thành:

10Các mô tả nghĩa đen của tập tin mở này. Những gì liên quan đến bởi/proc/1650/fd/10

u Tập tin được mở để đọc và viết

W chương trình có một khóa ghi trên tập tin.


1
Tôi không thể tìm thấy nơi để nhận lslk, và nó dường như không còn được duy trì. Cũng đáng chỉ ra rằng, nếu bạn muốn lsof chỉ hiển thị các quy trình thực sự khóa tệp, bạn cần grep cho "^ mutex". Nó cũng không phân biệt giữa 'giữ' và 'chặn'.
Benubird

Ký tự chữ cái đầu tiên của trường FD là tệp có tệp được mở bằng (tôi giả sử đó là ý nghĩa của bạn khi giữ) ký tự chữ cái thứ hai tùy chọn là khóa (nếu có) trên tệp (mà tôi ' m giả sử là những gì bạn có nghĩa là "chặn") Ngoài ra flock! = mutex. Grep của bạn sẽ bỏ lỡ các khóa như trong bài (không đề cập đến trường đầu tiên là tên chương trình ...)
Bratchley

Ôi! Bạn nói đúng - "mutex" là tên của kịch bản của tôi, do đó, việc tìm kiếm "mutex" chỉ áp dụng cho trường hợp của tôi. Cảm ơn bạn đã chỉ ra điều đó
Benubird

cũng giống như tôi đã thực hiện một boo-boo quá: "Nhân vật của chữ cái đầu tiên là chế độ nó đã mở các tập tin với ..."
Bratchley

5

lsof có thể giúp xem danh sách các tập tin. Đây là cách để xem các tập tin bị khóa.

sudo lsof /var/lib/dpkg/lock 

0

trong trường hợp lsofbản thân nó bị thiếu trên hệ thống, ls /proc/*/fd/* | grep LOCK_FILE_NAMEnên cung cấp thông tin tương tự.

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.