web-dev-qa-db-ja.com

Java同期的にシェルスクリプトを実行する

JavaからBashシェルスクリプトを実行しようとしていますが、このコードを使用すると正常に実行されます。

public void executeScript() {
    try {
        new ProcessBuilder("myscript.sh").start();
        System.out.println("Script executed successfully");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

上記のコードは非同期で正常に実行されます。しかし、私が達成したいのは、コードを同期的に実行することです。 Javaプロセスで、スクリプトの実行が完了するまで待機してから、次のコードバッチを実行したいと思います。

要約すると、「Printステートメント-スクリプトが正常に実行されました」を実行したいと思いますバッチファイル( "myscript.sh")が実行を完了します。

ありがとう

8
user1295300

プロセスが終了するのを待ちたい、つまり waitFor() このように

public void executeScript() {
  try {
    ProcessBuilder pb = new ProcessBuilder(
      "myscript.sh");
    Process p = pb.start();     // Start the process.
    p.waitFor();                // Wait for the process to finish.
    System.out.println("Script executed successfully");
  } catch (Exception e) {
    e.printStackTrace();
  }
}
17
Elliott Frisch

ファイルをある場所から別の場所に移動したい場合、上記のコードは機能しないため、以下のコードで修正しました。

class Shell

{

  public static void main(String[] args) {
    try {
      ProcessBuilder pb = new ProcessBuilder("/home/sam/myscript.sh");
      Process p = pb.start();     // Start the process.
      p.waitFor();                // Wait for the process to finish.
      System.out.println("Script executed successfully");
    } catch (Exception e) {
      e.printStackTrace();
      }

  }
}


myscript.sh
#!/bin/bash   
mv -f /home/sam/Download/cv.pdf /home/sam/Desktop/
2
rgaut

Process#waitFor()を使用して、スクリプトが終了するまでJavaコードを一時停止します。

    try {
        Process p = new ProcessBuilder("myscript.sh").start();
        int rc = p.waitFor();
        System.out.printf("Script executed with exit code %d\n", rc);
1
Jim Garrison