Lock
pid 和 lock 文件有什麼用?
我經常看到程序指定 pid 和鎖定文件。我不太確定他們在做什麼。
比如編譯nginx的時候:
--pid-path=/var/run/nginx.pid \ --lock-path=/var/lock/nginx.lock \
有人可以對此有所了解嗎?
pid 文件是由一些程序編寫的,用於在它們啟動時記錄它們的程序 ID。這有多種用途:
- 這是向系統的其他程序和使用者發出該特定程序正在執行或至少成功啟動的信號。
- 它允許人們編寫一個非常容易檢查它是否正在執行的腳本,並
kill
在想要結束它時發出一個簡單的命令。- 對於程序來說,這是一種查看它之前執行的實例是否沒有成功退出的廉價方法。
當然,僅存在 pid 文件並不能保證該特定程序 id 正在執行,因此這種方法不是 100% 萬無一失的,但在很多情況下“足夠好”。檢查程序表中是否存在特定 PID 不能在類 UNIX 作業系統中完全可移植,除非您想依賴該
ps
實用程序,這可能不希望在所有實例中呼叫(我相信一些類 UNIX 作業系統ps
無論如何實施不同)。鎖定文件的想法如下:目的是為一個程序的兩個(行為良好的)獨立實例,它們可能在一個系統上同時執行,不要同時訪問其他東西。這個想法是在程序訪問其資源之前,它檢查是否存在鎖定文件,如果鎖定文件存在,要麼出錯,要麼等待它消失。當它不存在時,想要“獲取”資源的程序會創建該文件,然後稍後可能遇到的其他實例將等待此過程完成。當然,這是假設“獲取”鎖的程序確實釋放了它並且沒有忘記刪除鎖文件。
之所以可行,是因為所有類 UNIX 作業系統下的文件系統都強制執行序列化,這意味著在任何給定時間實際上只發生對文件系統的一次更改。有點像數據庫等的鎖。
作業系統或執行時平台通常會提供同步原語,而使用它們通常是更好的決定。可能會出現一些情況,例如編寫一些旨在在過去和未來在各種作業系統上執行的東西,而沒有可靠的庫來抽象呼叫(例如可能
sh
或bash
基於腳本,旨在以各種 unix 風格工作) - 在這種情況下這個方案可能是一個很好的折衷方案。