2016-02-28 23 views
0

假設在Java中我有一個簡單的Echo客戶端/服務器對。我啓動了服務器進程,但我從來沒有真正啓動客戶端進程。如何殺死一個Java程序(在Windows中)?

我想要做的是有第三個程序(稱爲「Parent」),它會在空閒30秒後自動終止該服務器程序。

我可以使用Powershell來做到這一點嗎?還是我需要使用C或其他編程?

+2

讓服務器程序自己做這件事是否更容易? – Kenney

+1

基本上你不想做這樣的事情,你可以在你的服務器上創建另一個線程,在n秒鐘後打破循環,並很好地退出 – svarog

+0

@Kenney - 確實,這很容易。然而,在我的情況下,我想要有一個「超級父母」的排序,這實際上將重新啓動客戶端 - 服務器對。因此,就好像我們正在替換會注意到服務器死亡的人,然後手動重新啓動客戶端服務器。無可否認,這是一個人爲的例子(我意識到它也不那麼實際),但它是學術練習的一部分。猜測,它肯定會結束「黑客」 – Coffee

回答

1

是的,只要你有一個好辦法: 1)唯一標識服務器進程 2)確定服務器空閒

如果永遠不會有服務器進程的兩個(或更多)實例,那麼你可以通過名稱來識別進程(確保你的進程有一個獨特的名字!)

確定服務器空閒可能會很棘手(因此,實現服務器停止自己而不訴諸「父」處理)。但是,如果服務器處於活動狀態時處於內存或CPU密集型狀態,則可以利用該功能區分閒置和忙閒狀態。您可以使用get-process (gps)來確定進程當前的CPU和內存使用情況。訣竅是知道它目前看起來空閒時它已經閒置了多久。爲了可靠地執行此操作,您需要比使用服務器處理請求更頻繁地進行輪詢gps。否則,您可能在服務器繁忙之前進行輪詢,然後服務器處於忙碌狀態,然後在閒置時再次輪詢。但是你會認爲整個過程都是空閒的。

通過讓服務器知道它已經空閒了30秒,如窗口標題,可以避免上述困境。 (但是,如果你這樣做,爲什麼不只是讓服務器自己終止?)

一旦PS腳本確定服務器空閒,然後get-process -name yourServerProcess|stop-process將停止服務器進程。在末尾指定「yourServerProcess」而不帶.EXE。如果您遇到權限錯誤,請以管理員身份運行PS。