2013-10-11 88 views
0

我使用Amazon EC2實例通過使用AWS Java SDK執行一些複雜的計算,但這些計算有時可能需要很長時間。因此,我需要從Java代碼中遠程殺死在EC2實例上運行的進程,以便我可以在不需要停止和啓動實例的情況下重複使用同一個實例進行其他任務。如何遠程殺死亞馬遜EC2 linux實例上的進程

停止和開始的問題是,亞馬遜將部分時間視爲完整時間,因此我的目標是讓我的代碼更具成本效益。

我使用SSH連接我的EC2實例,這就是我如何傳遞命令在那裏執行。我懷疑如果我斷開SSH連接並再次連接它,它會殺死在那裏運行的任何進程。

總之,我需要的不是Ctrl + C而是來自我的Java代碼(無需用戶干預)。那可能嗎?

編輯: 爲了闡明,計算由安裝在Linux EC2實例上的單獨工具執行。所以我只是傳遞命令來啓動這個工具,然後命令行會一直等到完成並顯示結果。在手動使用場景中,我可以在linux命令行上單擊Ctrl + C並獲取對命令行的控制權。但在我的情況下,如果可能的話,我想從java代碼中做類似的事情。

+0

這是一個可能的重複,可能會解決您的問題:http://stackoverflow.com/questions/6356340/killing-a-process-using-java – gimg1

回答

0

使用SIGAR library掃描機器上的進程列表並終止進程。

使用getProcList()讓所有進程ID,getProcArgs()讓每個進程的完整的命令行,並kill()殺死相關進程或進程。

所以如果一個任務正在運行並且你想殺死它,再次SSH進入機器並運行基於SIGAR的進程殺手。

0

一個髒/功能的方法是通過SSH使用java Runtime來執行它,從而殺死你的進程。

喜歡的東西

Runtime runtime = Runtime.getRuntime(); 
Process p = runtime.exec("ssh [email protected] command"); 

所以你的情況,如果你知道程序的(例如1234)PID:

Process p = runtime.exec("ssh [email protected] kill 1234"); 

或者,如果你知道程序的名字:

Process p = runtime.exec("ssh [email protected] pkill my_program_name_x64"); 

請注意,您通常必須爲通過運行時調用的可執行文件提供絕對路徑。

所以你必須通過類似/bin/ssh/usr/bin/ssh以及爲killpkillkillall更換SSH。