簡體   English   中英

Runtime.exec沒有運行但沒有異常

[英]Runtime.exec not running but no exception

我想使用Java在特定位置運行腳本。 如果我手動運行該腳本,它將運行良好:

     /export/home/trace.sh param1 param2 param3 param4

這是我從Java運行腳本的代碼:

     try {

      Runtime runtime = Runtime.getRuntime();
      Process proc = null;
      System.out.println("starting search");
      proc = runtime.exec( pathServer + "/trace.sh " + fullDate + " " + fullDateTo + " " + mA.substring(2) + " " + mB.substring(2));
      InputStream inputstream           =   proc.getInputStream();
      InputStreamReader inputstreamreader   =   new InputStreamReader(inputstream);
      BufferedReader bufferedreader         =   new BufferedReader(inputstreamreader);
      System.out.println("end search " + System.currentTimeMillis());
      }
     catch (Exception e)
      {
         System.out.println(e.toString());
         e.printStackTrace();
      }

如果腳本運行,它將在指定位置生成“ txt.dat”。 但是沒有生成“ txt.dat”。 我試圖找出異常是什么,但沒有異常捕獲。

我的代碼已經正確了嗎? 我怎么知道它是否正在處理腳本? 我如何捕獲在此過程中發生的任何異常? 謝謝。


更新2

我添加了一些代碼來打印getInputStreamgetErrorStream 對於getInputStream ,我什么也沒得到,這意味着它為空。 對於getErrorStream ,我得到這個結果

         Host key verification failed

我仍然不知道這個錯誤是什么意思。

Java應用程序在服務器B中運行。

通常,我嘗試調用的腳本(在服務器B中)將SSH到服務器A並在服務器A中運行其他腳本。它將生成text.dat,然后sftp到服務器B。手動運行時,txt.dat成功生成並傳輸到服務器B。


更新3

感謝您的所有幫助和建議。 原來,我的Java應用程序在不同的用戶下運行。 當我手動運行它時,我使用了另一個用戶。 因此,我已將主機密鑰從服務器B添加到服務器A。它現在已成功運行。

如果您的命令失敗, Runtime.exec不會引發異常。

您可以使用process.exitValue()獲得執行結果。

您也可以從您在代碼中創建的process.getInputStream()讀取腳本輸出,但由於某些原因而無法讀取。 在腳本中放入一些echo語句以進行調試。

您可以對代碼進行很多改進。

  1. 使用ProcessBuilder創建您的流程,而不是Runtime 它為您提供更多選擇和更好的控制
  2. 將命令的每個組件作為單獨的字符串傳遞給構建器
  3. 完全消耗您的輸出和錯誤流
  4. 等待過程實際完成

像這樣:

try {
    ProcessBuilder builder = new ProcessBuilder()
            .command("/export/home/trace.sh", param1, param2, param3, param4);
    builder.redirectErrorStream(true);

    System.out.println("starting search");
    Process proc = builder.start();
    final BufferedReader bufferedreader = new BufferedReader(
            new InputStreamReader(proc.getInputStream()));
    new Thread() {
        @Override
        public void run() {

            try {
                String line = null;
                StringBuffer buffer = new StringBuffer(2048);
                while ((line = bufferedreader.readLine()) != null) {
                    buffer.append(line);
                }
            } catch (final IOException ioe) {
                ioe.printStackTrace();
            }
            // Do something with process output, if needed
        }
    }.start();

    proc.waitFor();
    System.out.println("end search " + System.currentTimeMillis());
} catch (Exception e) {
    e.printStackTrace();
}

您可以調試或打印Process.getErrorStreamProcess.getInputStream來檢查子流程報告的錯誤。

我的猜測是您需要調用/bin/sh作為主程序,並將腳本作為參數傳遞,但是我不確定。 我知道您必須在Windows上執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM