2016-11-17 35 views
1

我的任務: 1 - 讀取Excel文件,分析它,並保存爲TXT文件中的數據。 2 - 讀取該txt文件並將其傳遞給batch.sh文件。這batch.sh文件做一件事,它從上述txt文件中挑選數據並將其保存在數據庫的表中。運行sh文件中的Java代碼的Linux計算機

當我從終端運行batch.sh文件(並給它的txt文件),它工作正常。它按照我的意願將記錄插入到數據庫中。

問題是,當我想要做相同的Java代碼,該batch.sh文件不起作用。而且,也不會拋出異常。

一些說明:我正在使用Java 7,Oracle,SQL-Loader,Linux。

附加信息:如果我重命名batch.sh文件batch.bat文件,並在Windows環境下運行它,它完美的罰款。如果從終端執行batch.sh文件也可以正常工作。唯一的問題是,它不能從java代碼工作。

我列出了以下任務的java代碼片段,batch.sh文件和control.txt文件。

Java代碼:

try{ 
    String target = new String("/path/to/batchFile/batch.sh"); 
    Runtime rt = Runtime.getRuntime(); 
    Process proc = rt.exec(target); 
    proc.waitFor(); 
}catch(Exception e){ 
    LOG.error("Exception Occured with Message : "+e.getMessage()); 
} 

Batch.sh:

sqlldr username/[email protected] control='/path/to/batchFile/control.txt' log='/path/to/batchFile/Results.log' bad='/path/to/batchFile/BadFile.bad' ERRORS=5000 

control.txt:

options (skip=1) 
load data 
    infile    '/path/to/batchFile/TxtFileData.txt'   
    truncate into table TABLE_NAME 
fields terminated by ","  

    ( 
    column_name "replace(:column_name,'-','')"  
) 

P.S:我已經閱讀了有關同一問題的許多職位,並試圖每一個解決方案,但不工作。當前的Java代碼示例取自另一個StackOverFlow線程。

任何幫助將不勝感激。

回答

2

你想要runtime.getRuntime.exec(new String[]{"/bin/bash", "-c", "/path/to/script.txt"}) 在這裏看到:How to execute command with parameters?

+0

感謝您抽出時間進行了迴應。只是爲了快速思考......你能告訴我什麼是3個字符串參數代表什麼? –

+0

第三個參數似乎是文件名的絕對路徑......但是第一個和第二個參數呢?他們代表什麼? –

+0

我的歉意。/bin/bash是shell解釋器,之後的所有內容都是參數,所以它相當於運行/ bin/bash -c/path/to/your/script。txt或其他,我們這樣做的原因是因爲當你在一個shell中時,sh文件是由bash自動執行的,而java的運行時執行服務則不是。所以你明確地告訴它運行它。你實際上需要刪除-c,但它取決於上下文是什麼,例如:/ bin/bash -c ping -n google.com很好,但實際的腳本是/ bin/bash/path/to/script.sh和工作,我忘了。 – zack6849

相關問題