为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

陪伴而非守候 2023-06-08 17:36:30
我在 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 :(谁知道为什么会这样?
查看完整描述

1 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

产生输出的 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 程序员,所以我无法就最好的方法向您提供建议。


查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信