2010-12-03 14 views
1

私はコマンドの束を実行し、コマンド出力を>を使ってログファイルにリダイレクトするbashシェルスクリプトを持っています。 Runtime.getRuntime().exec("sh shellscript.sh");を使ってJavaからシェルスクリプトを呼び出すと、シェルスクリプトが実行されますが、ログファイルは書き込まれません。どうして?そして私はそれをどのように機能させるのですか?Javaからのリダイレクションでbashスクリプトを呼び出す

編集: だから私がやっていることは少し異なります。あなたのコードは正常に動作します。しかし、Javaプログラム内のリダイレクトは機能しません。以下のサンプルプログラムでは、ログファイルは書き込まれません。

$ cat script.sh 
#!/bin/sh 

echo "Hello there" 
echo "Hello there 2" 


$ cat RunScript.java 
public class RunScript { 
    public static void main(String[] argv) throws Exception { 
     int i = Runtime.getRuntime().exec("sh /home/gpx/script.sh >> log").waitFor(); 
     System.out.println("Exit code : " + i); 
    } 
} 

答えて

2

あなたが書き込んでいるリダイレクトは絶対ファイルパスまたは相対ファイルパットに書き込んでいますか?

相対的な場合は、(おそらく)作業ディレクトリからの相対パスなので、それを確認してください。

私はそれをしたサンプルテストは、絶対パスがうまくいくショー

$ cat script.sh 
#!/bin/sh 

echo "Hello there" 
echo "Hello there 2" >> /Users/madhurt/test/log 

exit 2 

$ cat RunScript.java 
public class RunScript { 
    public static void main(String[] argv) throws Exception { 
     int i = Runtime.getRuntime().exec("sh /Users/madhurt/test/script.sh").waitFor(); 
     System.out.println("Exit code : " + i); 
    } 
} 
$ pwd 
/Users/madhurt/test 
$ ls -lrt 
total 24 
-rwxr-xr-x 1 madhurt staff 87 Dec 6 18:28 script.sh 
-rw-r--r-- 1 madhurt staff 214 Dec 6 18:32 RunScript.java 
-rw-r--r-- 1 madhurt staff 907 Dec 6 18:32 RunScript.class 
$ java RunScript 
Exit code : 2 
$ ls -lrt 
total 32 
-rwxr-xr-x 1 madhurt staff 87 Dec 6 18:28 script.sh 
-rw-r--r-- 1 madhurt staff 214 Dec 6 18:32 RunScript.java 
-rw-r--r-- 1 madhurt staff 907 Dec 6 18:32 RunScript.class 
-rw-r--r-- 1 madhurt staff 14 Dec 6 18:33 log 
$ cat log 
Hello there 2 
$ 
+0

これらは相対的なものです。 'cat file.txt >> log.txt'のようなものを書くだけです。すでに確認済みです! – GPX

+1

相対パスである場合は、実行するjavaプロセスの作業ディレクトリに対する相対位置に書き込まれます。したがって、javaプロセスの作業ディレクトリを基準にしたログファイルを確認する必要があります。しかし、私はそれを推奨しません - ログファイルは絶対的な場所に書き込まれる必要がありますが、これは構成可能でなければなりません。 – madhurtanwani

+0

さて、絶対パスで書き直しました。助けてくれなかった! – GPX

0

私のJavaの知識は乏しいですが、それはあなたが書く必要が私の理解です:

Runtime.getRuntime().exec("sh shellscript.sh").waitFor(); 
+0

これも試しました。動作しません! – GPX

0

チェックあなたが持っている場合ログを追加しているパスにも書き込み権限を与えてください。コンテナ内でこのアプリを実行すると、そのユーザーのIDを使用する可能性が高くなります。 /tmp/にファイルを書き込んで、そこに表示されているかどうか確認してください。

関連する問題