2011-03-05 184 views

回答

0

這通常使用pidfiles完成:/var/run/[name].pid中的文件只包含由fork()返回的進程ID。

 
if pidfile exists: 
    exit() 
else: 
    create pidfile 
    pid = start_background() 
    pidfile.write(pid) 

On shutdown: remove pidfile 
+0

我沒有看到該文件夾​​中的許多pid文件,很多都丟失了。還有其他地方嗎? – Blackbinary 2011-03-05 20:16:28

+0

這就是系統pidfiles根據[FHS](http://www.pathname.com/fhs/2.2/fhs-5.13.html)放置的位置。 如果您正在編寫用戶級程序,可以將pidfile放在用戶的主目錄(〜/。[name]/[name] .pid)中。 – i80and 2011-03-05 20:26:00

+0

這種方法引入了一個競爭條件,對吧? – Vlad 2011-03-05 20:28:40

5

通常情況下這樣做的自由種族的方式是:

  • 打開鎖文件/寫PID文件(但不截斷它)
  • 嘗試上採取的排它鎖它(使用fcntl或flock)不會被阻塞
  • 如果使用EAGAIN失敗,那麼其他進程已經在運行。
  • 文件描述符現在應該已經爲守護被繼承和保持開放其使用壽命

這樣做了簡單的存儲PID的優點是,如果有人重複使用PID,你不會得到一個假陽性。

在文件中存儲pid最大的問題是系統啓動守護進程使用的低編號的pid可能會被其他守護進程重新引導重用。我看到過這種情況。

0

Linux軟件,目前爲止大並不關心關於程序的排他性,只有他們使用的資源。 「關懷」通常由實施提供(例如,發行基礎設施)。例如,如果你想運行一個程序,但該程序鎖定或變成殭屍,你無法殺死它,或者它作爲一個不同的用戶執行其他功能運行。程序爲什麼要關心另一個副本是否正在運行?這樣做似乎只是一種不必要的限制。

如果它是一個打開套接字(如TCP端口)的進程,如果程序無法打開套接字,程序將失敗。如果它需要對文件進行獨佔訪問,如果它無法獲取,請將其失敗。支持PID文件,但不要強制執行。

你會在GNU軟件中看到這種方法,這是使它如此多才多藝的一部分。

相關問題