从 Java 调用的 Perl 脚本没有输出

我在 Java 中使用 Ganymed ssh lib 连接到 Linux 机器并执行一些 unix 脚本,并显示它们的输出。


我正在运行一个父 shell 脚本,该脚本依次运行其他几个子脚本,最后运行一个 perl 脚本。一切都适用于 shell 脚本,但是当它到达 perl 脚本时,我停止获得任何输出。


如果我在 Linux 服务器上手动运行父脚本,我会看到 perl 的输出没有问题。


这是相关的 java 代码,连接到机器并调用 shell 脚本,并返回一个 BufferedReader,从那里可以逐行读取输出:


try {

            conn = new Connection(server);

            conn.connect();

            boolean isAuthenticated = conn.authenticateWithPublicKey(user, keyfile, keyfilePass);

            if (isAuthenticated == false) {

                throw new IOException("Authentication failed.");

            }

            sess = conn.openSession();

            if (param == null) {

                sess.execCommand(". ./.bash_profile; cd $APP_HOME; ./parent_script.sh");

            }

            else {...}


            InputStream stdout = new StreamGobbler(sess.getStdout());

            reader = new BufferedReader(new InputStreamReader(stdout));


        } catch (IOException e) {

            e.printStackTrace();

        }

我调用的父 shell 脚本如下所示:


./start1  #script1 output OK

./start2  #script2 output OK

./start3  #script3 output OK

/u01/app/perl_script.pl # NO OUTPUT HERE :(

谁知道为什么会这样?


陪伴而非守候
浏览 159回答 1
1回答

蛊毒传说

产生输出的 Perl 代码部分是:warn Dumper { stdout => $stdout,              stderr => $stderr,              status => $status };发出警告,通常通过将其打印到STDERR但是您的 Java 程序正在从STDOUT.InputStream stdout = new StreamGobbler(sess.getStdout());你有几个选择。更改您的 Perl 代码以将输出发送到STDOUT而不是STDERR. 这可能很简单,只需更改warn()为print().在 shell 脚本中调用 Perl 程序时,重定向STDERR到STDOUT./u01/app/perl_script.pl 2>&1我猜你也可以设置你的 Java 程序来读取STDERR。但我不是 Java 程序员,所以我无法就最好的方法向您提供建议。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java