我在 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 程序員,所以我無法就最好的方法向您提供建議。
添加回答
舉報
0/150
提交
取消