Pid và khóa tập tin để làm gì?


75

Tôi thường thấy rằng các chương trình chỉ định pid và khóa các tập tin. Và tôi không chắc chắn những gì họ làm.

Ví dụ: khi biên dịch nginx:

--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \

Ai đó có thể làm sáng tỏ về điều này?

Câu trả lời:


86

tập tin pid được viết bởi một số chương trình để ghi lại ID tiến trình của chúng trong khi chúng đang bắt đầu. Điều này có nhiều mục đích:

  • Đó là một tín hiệu cho các quá trình và người dùng khác của hệ thống rằng chương trình cụ thể đó đang chạy hoặc ít nhất đã bắt đầu thành công.
  • Nó cho phép một người viết một kịch bản thực sự dễ dàng để kiểm tra xem nó có đang chạy hay không và đưa ra một killlệnh đơn giản nếu muốn kết thúc nó.
  • Đây là một cách rẻ tiền để một chương trình xem liệu một phiên bản chạy trước đó của nó không thoát thành công.

Tất nhiên, sự hiện diện của một tệp pid không đảm bảo rằng id quá trình cụ thể đó đang chạy, tất nhiên, vì vậy phương pháp này không thể đánh lừa 100% nhưng "đủ tốt" trong nhiều trường hợp. Kiểm tra xem một PID cụ thể có tồn tại trong bảng quy trình không hoàn toàn di động trên các hệ điều hành giống như UNIX trừ khi bạn muốn phụ thuộc vào pstiện ích, điều mà có thể không mong muốn gọi trong mọi trường hợp (và tôi tin rằng một số hệ điều hành giống UNIX thực hiện pskhác nhau nào).

Các tệp khóa được các chương trình sử dụng để đảm bảo hai trường hợp riêng biệt (hoạt động tốt) của một chương trình, có thể đang chạy đồng thời trên một hệ thống, không truy cập cùng lúc một thứ khác. Ý tưởng là trước khi chương trình truy cập vào tài nguyên của nó, nó sẽ kiểm tra sự hiện diện của tệp khóa và nếu tệp khóa tồn tại, có thể xảy ra lỗi hoặc đợi nó biến mất. Khi nó không tồn tại, chương trình muốn "thu nhận" tài nguyên tạo tệp và sau đó các trường hợp khác có thể gặp sau này sẽ chờ quá trình này được thực hiện với nó. Tất nhiên, điều này giả định chương trình "có được" khóa thực sự giải phóng nó và không quên xóa tệp khóa.

Điều này hoạt động vì hệ thống tệp trong tất cả các hệ điều hành giống như UNIX thực thi tuần tự hóa , có nghĩa là chỉ một thay đổi đối với hệ thống tệp thực sự xảy ra tại bất kỳ thời điểm nào. Sắp xếp giống như khóa với cơ sở dữ liệu và như vậy.


1
Điều này là chính xác, trừ khi tập tin khóa được xóa bằng tay. VMWare Player thể hiện hành vi này, ví dụ, nếu VMWare Player gặp sự cố, bạn phải xóa một .lcktệp trong thư mục của VM nếu không nó sẽ cho bạn biết nó đang được sử dụng khi bạn cố gắng khởi động nó.
LawrenceC

1
Còn Windows thì sao? Làm thế nào để nó xử lý các tập tin .lock? Rốt cuộc, nó không giống Unix.
SarahofGaia

2
Tôi không nghĩ các chương trình Windows hoạt động theo cách này là phổ biến. Các chương trình duy nhất có hành vi này mà tôi đã thấy là các cổng từ Unix / Linux
HaMster 23/2/2016

2
LawrenceC, Re " Khi nó không tồn tại, chương trình muốn" thu nhận "tài nguyên tạo tệp "; Nhưng có những chức năng thích hợp được xây dựng đặc biệt để thực hiện đồng bộ hóa như vậy. Tại sao không dựa vào các chức năng đó thay vì sử dụng "tập tin hack"?
Pacerier

1
@Pacerier - Các tệp khóa theo kiểu này có lẽ thường được sử dụng bởi những thứ như shell script hoặc chương trình có thể tương tác với shell script, vì shell Unix / Linux tương tác với hệ thống tệp rất dễ dàng, so với các nguyên thủy đồng bộ hóa khác. Các tập tin cũng dễ dàng tồn tại trên các quy trình khác nhau. Một chương trình hiệu suất cao rõ ràng có thể sẽ làm phiền các nguyên thủy hệ điều hành gốc so với các tệp để đồng bộ hóa mọi thứ bên trong hoặc thậm chí so với các quy trình khác không có vỏ.
LawrenceC

14

Các tệp này thường được sử dụng bởi trình nền chỉ nên chạy một lần trên hệ thống. Tệp PID thường chứa số ID tiến trình của chương trình đã khởi chạy và đang chạy nếu có. Ngoài ra, khi nó khởi động, nó tạo tập tin khóa. Miễn là tệp khóa tồn tại, nó sẽ không bắt đầu một tệp khác mà không có sự can thiệp của người dùng. Nếu tệp khóa tồn tại và id quá trình được đề cập trong tệp pid không chạy, daemon được coi là ở trạng thái "chết", có nghĩa là nó được chạy nhưng có lẽ không phải do sự cố hoặc tắt máy không đúng cách . Điều này có thể bắt đầu một kịch bản khởi động / khởi động lại đặc biệt cho một số chương trình. Tắt nó đúng cách sẽ loại bỏ các tập tin khóa.


+1 Giải thích việc sử dụng có cả tệp khóa và tệp pid.
Kyle Krull

@Caleb - Vui lòng giải thích lý do tại sao cả tệp PID và tệp khóa sẽ được sử dụng. Có vẻ như một tập tin PID là đủ. Nếu tệp PID tồn tại, có thể kiểm tra PID để xem liệu quy trình có đang chạy hay không, chỉ cần thực hiện ít bước hơn là kiểm tra tệp khóa, kiểm tra tệp PID và sau đó xác minh sự tồn tại của quy trình.
MVaughan

@MVaughan Để tránh điều kiện cuộc đua nếu không có gì khác. Một số ứng dụng đã sử dụng nhiều lần khi vẫn cần PID nhưng có thể từ bỏ khóa. Nhưng ở cấp độ cơ bản hơn nếu bạn quá tải một tệp cho cả hai thao tác, bạn sẽ mở ra những thất bại như sự cố để lại trạng thái không nhất quán trên hệ thống.
Caleb

8

Một tệp PID sẽ chứa ID tiến trình của một quy trình đang chạy. Điều này có nhiều cách sử dụng khác nhau; bạn có thể đọc nó và kiểm tra xem tiến trình có còn chạy không và thực hiện hành động thích hợp hoặc đọc nó và giết tiến trình.

Một tập tin khóa rất có thể là ứng dụng cụ thể. Các tệp khóa được sử dụng để chỉ ra rằng một số tài nguyên đang được sử dụng và quá trình muốn truy cập phải đợi cho đến khi tài nguyên được giải phóng trước khi tiếp tục.

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.