2010-06-10 117 views
7

我的主要領域是.Net,但最近我得到了一些與Java有關的東西。我必須在Java中創建一個可以在後臺運行的shell實用程序,在指定的持續時間後讀取少量數據庫記錄並進行進一步處理。這是一種調度器。現在我有幾個擔心:如何停止從命令行執行Java程序?

如何使這項工作作爲服務。我想通過一個shell腳本來執行它,並且該實用程序應該開始運行。當然,控制應該回到調用腳本。

其次,最終我可能想停止運行這個過程。如何實現這一目標?

我明白這些都是基本問題,但我真的不知道從哪裏開始,哪些選項最適合我。

任何幫助/建議嗎?

+0

@danben當然,會做...感謝 – Aakash 2010-06-10 15:55:18

回答

2

我會去使用調度程序或服務來運行程序。但是,如果你想使用一個bat文件,並做到這一點編程,我提出了以下可能的方法:

在Java程序中,你可以得到PID程序,然後將其寫入文件:

public static void writePID(String fileLocation) throws IOException 
{ 
    // Use the engine management bean in java to find out the pid 
    // and to write to a file 
    if (fileLocation.length() == 0) 
    { 
     fileLocation = DEFAULT_PID_FILE; 
    }  
    String pid = ManagementFactory.getRuntimeMXBean().getName(); 
    if (pid.indexOf("@") != -1) 
    { 
     pid = pid.substring(0, pid.indexOf("@")); 
    }            
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileLocation)); 
    writer.write(pid); 
    writer.newLine(); 
    writer.flush(); 
    writer.close();      
} 

然後,您可以編寫一個停止.bat文件,該文件將在Windows中終止正在運行的程序。你可以這樣做:

setlocal 
IF EXIST app.pid FOR /F %%i in ('type app.pid') do TASKKILL /F /PID %%i 
IF EXIST app.pid DEL app.pid 
endlocal 

當然,app.pid是由上面的Java方法編寫的文件。

我不知道你將如何編寫一個腳本來啓動一個Java程序,並恢復終止控制。我想知道是否有人爲此提供解決方案。

+0

這是否意味着我可能必須編寫另一個Java應用程序來讀取該文件並終止正在運行的進程? – Aakash 2010-06-11 08:28:51

+0

不,.bat文件是會損害您的進程的位。這是一個VBScript,是殺死正在運行的應用程序。 如果你正在* nix上運行這個,你可以編寫一個shell腳本,它可以執行這個腳本。一樣的東西。 – Luhar 2010-06-11 11:59:41

1
ps ux 

看到pid

kill pid 

或者你最好提供信號的應用程序,它確實System.exit(0)

+0

只要他不做類似數據庫交易的事情,殺死pid就沒問題。如果他有數據庫事務處理,可能需要做更多的事情。 – bwawok 2010-06-10 12:10:17

+0

@bwawok你是對的。我在那裏做數據庫工作。 – Aakash 2010-06-10 15:57:18

1

你沒有指定平臺停止腳本。如果在Windows上,您應該考慮與服務控制集成以創建Windows服務。 http://en.wikipedia.org/wiki/Windows_service。一旦實現了服務掛鉤,就可以通過服務控制GUI或使用命令行中的net stop MyService語法來啓動和停止該服務。

+0

我想在Unix平臺上做到這一點。謝謝 – Aakash 2010-06-10 15:56:10

2

我假設你正在用Linux/Unix機器玩你的java程序。 運行應用程序作爲一個守護進程,你可以嘗試

nohup java YourJavaClass & 

要停止你的應用程序,您可以:

kill [psIdofYourApplication] 

fg [your application job Id] 
Ctrl-C 

如果你想要做一些後處理應用程序收到'kill/stop'信號後。退房addShutdownHook(Thread hook)

或者sun.misc.SignalHandler

0

據我瞭解,你想是這樣的:

if (System.in.avaliable() > 0) { 
    in = new BufferedReader(new InputStreamReader(System.in); 
    String InLine = in.readLine(); 
    ... 
} 

我說得對不對?