2012-07-25 88 views
1

好的,所以我有幾個Java程序在Linux服務器上使用chron作業運行。這些作業每隔十分鐘左右運行一次,花兩分鐘時間運行,然後退出。我需要爲程序添加一種方法來檢測,當它們啓動時,是否已經有一個自己的實例正在運行,如果是,則不必進一步退出。我真的不確定處理這個問題的最佳方法,但我希望有人能提供一些建議。檢測在linux機器上運行的java程序

我考慮過的一種方法是從執行某種PS命令的Java代碼運行命令行參數,並查看它們是否正在運行。儘管對於如此之小的東西來說,這看起來相當挑剔和複雜。另外,我並不是那麼熟悉Linux,我甚至不確定最好的方式來做到這一點。如果有人有更好的想法,請告訴我。或者如果這是最好的方法,如果你能提供我需要的linux命令,我會很感激。謝謝。

+3

這通常是通過創建'.lock'文件來完成。 – 2012-07-25 15:11:29

+0

實際上並不涉及java。同樣的問題適用於任何語言。 – 2012-07-25 15:14:00

+0

我會將java程序的調用包裝在一個shell腳本中,並檢查每個ps和grep像'ps auxww | grep '鎖定文件的問題在於,有可能在java程序崩潰的情況下它不會被清除。 – jayeff 2012-07-25 15:17:11

回答

1

如果你有一個可寫/ tmp目錄,你可以使用一個鎖文件。

當您的Java程序啓動時,請在/ tmp目錄中檢查具有您的應用程序唯一名稱的文件(例如「my-lock-file.lock」)。如果不存在,請創建一個,然後在完成後將其刪除。如果存在,就退出。

您可以使用java.io.File類的.exists()方法檢查文件是否存在。

如果您的代碼需要可移植,您可以使用System.getProperty("java.io.tmpdir"));爲運行代碼的平臺獲取適當的臨時目錄。

+1

而是使用'System.getProperty(「java.io.tmpdir」));'得到一個獨立於操作系統的臨時目錄。 – Joost 2012-07-25 15:17:25

+0

好點! OP提到了一個Linux平臺,但我會繼續修改我的答案。 – atomicinf 2012-07-25 15:20:14

+0

@atomicinf感謝您的信息。不知道鎖定文件,所以感謝您的建議,我檢查了一下,發現了一個解決方案,我認爲它應該能夠正常工作,並且在代碼突然退出後自行清理。 – cardician 2012-07-25 16:27:09

0

你可以看看JMX和附加API來查詢運行的JVM。或者,如Andrew logvinov提到的那樣,使用鎖定文件。

如果您使用的是Java WebStart,則已經有了對此的原生支持。

0

許多程序通過創建指向其PID的臨時文件(通常稱爲「鎖定」文件)來解決此問題。文件名應對所有相關信息進行編碼,以便將此進程與可合法並行運行的其他進程區分開來。

例如,如果進程綁定到用戶,它應該包含用戶名。如果進程綁定到一臺機器上,它應該(也)包含主機名(如果你把它放在機器的臨時目錄中,這是有爭議的,如果你把它放在一個主目錄中,考慮多臺機器的情況通過NFS共享一個家)。

這些文件的位置通常是/ tmp。這是一個很好的位置,因爲/ tmp通常在系統啓動時被擦除,所以在系統崩潰的情況下不會留下孤立文件。某些程序使用的另一種解決方案是將鎖定文件放在用戶設置目錄中,如果它與設置有關。例如。 mozilla thunderbird有一個名爲/home/<username>/.thunderbird/<profilename>.default/lock的文件。

該文件應該包含進程的PID。這個想法很簡單:如果文件包含PID,很容易檢查這個過程是否確實仍在運行。所以如果進程崩潰,文件就會成爲孤兒。新的流程實例將檢查文件中的PID,看看它不再運行,並忽略該文件(覆蓋)。

全部放在一起,你可以創建這樣一個文件:

​​

隨着內容:

12345 
相關問題