我嘗試這樣做:如何從Tomcat中的webapp重新啓動Tomcat?
但只有關機工作正常,Tomcat的不正常啓動,我認爲問題是,前一個實例仍在使用8080端口。我加了兩個命令之間的睡眠2M(與& &分開),但在這種情況下,關機發生,但根據卡塔利娜日誌沒有發生任何事情,沒有錯誤,啓動根本沒有執行。
(我第一次嘗試沒有/斌/慶典-c,但在這種情況下,什麼都沒有發生。)
我嘗試這樣做:如何從Tomcat中的webapp重新啓動Tomcat?
但只有關機工作正常,Tomcat的不正常啓動,我認爲問題是,前一個實例仍在使用8080端口。我加了兩個命令之間的睡眠2M(與& &分開),但在這種情況下,關機發生,但根據卡塔利娜日誌沒有發生任何事情,沒有錯誤,啓動根本沒有執行。
(我第一次嘗試沒有/斌/慶典-c,但在這種情況下,什麼都沒有發生。)
切勿使用Runtime.getRuntime().exec(String)
。它不符合人們的期望。使用接受String[]
的版本。
另外,在後臺運行它並重定向stdout/stderr,否則它將阻塞等待java進程讀取其輸入。
Runtime.getRuntime().exec(new String[] {
"/bin/bash", "-c",
"(" +
System.getProperty("catalina.home") + "/bin/shutdown.sh && " +
System.getProperty("catalina.home") + "/bin/startup.sh" +
") > ~/restart.log 2>&1 &"
});
這寫~/restart.log
,因此,如果失敗的話,你可以看到錯誤消息。當它工作時,您可以用/dev/null
替換它。
我會強烈建議創建一個新的腳本restart_tomcat
做所有這backgrounding和重定向,這樣就可以減少這
Runtime.getRuntime().exec(new String[] { "/path/to/restart_tomcat" });
它更容易和更靈活的與文件系統中的腳本,而不是工作嵌入在Java代碼中的腳本。
謝謝你的回答。在你回答之前,我嘗試了與exec(String)相同的方式,但它不起作用,但是這個解決方案几乎可行,唯一的問題是shutdown.sh也啓動了後臺進程,這會阻止tomcat,而主進程返回,因此startup.sh在關閉結束前啓動,因此Tomcat無法正常啓動,因爲它的端口仍在使用。 這就是爲什麼我在2腳本之間添加了2米的睡眠時間,現在它可以工作(使用當前應用程序關閉tomcat遠不到2分鐘)。 – Zabalint
@ Zabalint,使用睡眠120?我試過了,但失敗了。 –
因此,如果您關閉了服務器及其中運行的所有應用程序,您如何期望其中一個應用程序再次啓動? – mikea
我除了它是由shell重新啓動的。這在Windows中工作: Runtime.getRuntime()。exec(「cmd/c start shutdown.bat && start startup.bat」); – Zabalint
是否可以在後臺進程中運行睡眠和啓動,並單獨關閉? – Zabalint