有沒有簡單的方法來確定某個過程是否正在運行? 我需要知道我的程序的一個實例是否在後臺運行,如果不是fork並創建後臺進程。確定進程是否正在運行?
1
A
回答
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
5
通常情況下這樣做的自由種族的方式是:
- 打開鎖文件/寫PID文件(但不截斷它)
- 嘗試上採取的排它鎖它(使用fcntl或flock)不會被阻塞
- 如果使用EAGAIN失敗,那麼其他進程已經在運行。
- 文件描述符現在應該已經爲守護被繼承和保持開放其使用壽命
這樣做了簡單的存儲PID的優點是,如果有人重複使用PID,你不會得到一個假陽性。
在文件中存儲pid最大的問題是系統啓動守護進程使用的低編號的pid可能會被其他守護進程重新引導重用。我看到過這種情況。
0
Linux軟件,目前爲止大並不關心關於程序的排他性,只有他們使用的資源。 「關懷」通常由實施提供(例如,發行基礎設施)。例如,如果你想運行一個程序,但該程序鎖定或變成殭屍,你無法殺死它,或者它作爲一個不同的用戶執行其他功能運行。程序爲什麼要關心另一個副本是否正在運行?這樣做似乎只是一種不必要的限制。
如果它是一個打開套接字(如TCP端口)的進程,如果程序無法打開套接字,程序將失敗。如果它需要對文件進行獨佔訪問,如果它無法獲取,請將其失敗。支持PID文件,但不要強制執行。
你會在GNU軟件中看到這種方法,這是使它如此多才多藝的一部分。
相關問題
- 1. Python,確定Unix進程是否正在運行的正確方法是什麼?
- 2. 確定作業是否正在運行
- 3. Linux進程是否正在運行?
- 4. 檢查進程是否正在運行
- 5. 檢查進程是否正在運行
- 6. 進程運行不正確
- 7. 確定進程是否在lxc/Docker中運行
- 8. 如何確定.NET代碼是否在ASP.NET進程中運行?
- 9. WINSDK:確定任意pid是否標識Windows上正在運行的進程
- 10. 如何確定Linux進程記帳(accton)當前是否正在運行?
- 11. 如何以編程方式確定ehcache是否正在運行?
- 12. 如何確定應用程序是否正在運行?
- 13. VBS如何確定程序是否正在運行
- 14. 以編程方式確定IIS站點是否正在運行
- 15. C++檢查特定進程是否正在運行
- 16. 檢查進程是否正在運行(使用進程名稱)
- 17. 如何確保正在運行的進程正在運行?
- 18. Process Class是否可用於確定進程是否已在運行?
- 19. 如何確定進程是否已成功運行命令c#
- 20. 確定一個進程是否按命令名運行
- 21. 確定瘦服務器是否作爲守護進程運行
- 22. 安裝.pkg:確定正在更新的應用程序是否正在運行?
- 23. 確定當前進程是否在WOW64中運行或不在執行
- 24. 確定一個可執行文件是否正在運行
- 25. 如何確定當前運行的進程是否爲父進程?
- 26. 檢測Windows進程和應用程序是否正在運行
- 27. 通過Shell腳本確定Linux進程是否在給定參數下運行
- 28. 確定PyQt是否在Maya中運行
- 29. 如何確定一個進程是由進程名運行
- 30. 如何檢查正在運行的進程是否是後臺進程?
我沒有看到該文件夾中的許多pid文件,很多都丟失了。還有其他地方嗎? – Blackbinary 2011-03-05 20:16:28
這就是系統pidfiles根據[FHS](http://www.pathname.com/fhs/2.2/fhs-5.13.html)放置的位置。 如果您正在編寫用戶級程序,可以將pidfile放在用戶的主目錄(〜/。[name]/[name] .pid)中。 – i80and 2011-03-05 20:26:00
這種方法引入了一個競爭條件,對吧? – Vlad 2011-03-05 20:28:40