2013-01-09 37 views
0

運行shell命令我想從一個基於Spring Web應用程序調用mysqldump和輸出寫入到文件中。我希望能夠爲用戶提供一個下載鏈接到服務器上創建的文件。從春天的WebApp

我試着運行以下:

Runtime.getRuntime().exec("/usr/bin/mysqldump -u <username> -p<password> <db_name> >" + fileName); 
Runtime.getRuntime().exec("mysqldump -u <username> -p<password> db_name >" + fileName); 

我試過文件名的下列值。

fileName = "mysql.sql"; 
fileName = "/tmp/mysql.sql"; 
fileName = servletContext.getRealPath("") + "/mysql.sql"; 

但是該命令不成功。 process.exitValue()返回的2或6

ProcessBuilder pb = new ProcessBuilder("/usr/bin/mysqldump", " -u ", "<username>", " -p<password>", "<db_name>", " > ", fileName); 
    pb.redirectErrorStream(true); // equivalent of 2>&1 
    Process p = pb.start(); 
    p.waitFor(); 

這並不有助於以及一個錯誤代碼。

有人能告訴我什麼是運行從Web應用程序這樣的命令的最佳方式?輸出文件應該創建在哪裏? 上面的命令有什麼問題?

我需要能夠在不同的系統(Linux,Windows)中運行此。該webapp可以在任一系統上運行。如果需要,我可以在屬性文件中抽象出mysqldump路徑。但我該如何做這項工作?

+0

我想這個問題是輸出重定向像運行「ls」命令返回退出代碼0,但輸出不會去任何地方。 –

回答

0

這可能不是一個好主意。這個servlet可能需要一個非常寬鬆的安全環境才能運行。如果你進行搜索,你會發現很多有問題的人。

即使它的工作運行EXEC可能會阻止出於某種原因,並在servlet會超時,我不知道的後果,但他們不健全的對我好。

我們有一個類似的問題,我在幾年前工作過,編寫了一個簡單的多線程服務器,它可以排隊請求,並在有機會並處理諸如掛起,崩潰和重新啓動等事情時運行它們。它作爲jsvc守護進程運行。 servlet通過套接字向它發送消息。

+0

對於低負載服務器,這可能是一個大問題?我在XAMPP中擁有一切,像Windows上的設置,因此我可以確定路徑和所有內容。 –

+0

這似乎做的伎倆,我http://stackoverflow.com/a/10791175/161628 –

+0

的原因獨立的服務器,這些類型的命令需要很長的時間才能完成,可能阻塞或掛起。他們也可能會崩潰,離開servlet孤兒。一個簡單地啓動命令的服務器,對它進行排隊並允許你輪詢它的狀態,這對Web友好得多。請注意,隨着數據庫變得越來越大,所花費的時間將會增加,因此您需要將超時設置得較高。獨立服務器的另一個優點是,如果它的端口是打開的或者來自非java程序,它可以被遠程調用。 –