【问题标题】:Shell Script Won't Run From Java ProgramShell 脚本不会从 Java 程序运行
【发布时间】:2011-10-26 18:47:00
【问题描述】:

有两件事需要立即注意......

  1. shell 脚本手动运行良好
  2. 我写的一个简单的shell脚本(echo hello)通过java运行良好

所以我有一个 shell 脚本,我正在尝试通过 Java 进程运行。

File sqlF = new File("path to deploy script");

Process proc = rt.exec(sqlF + "/deploy.sh");
proc.waitFor();

System.out.println(proc.exitValue());

当我运行这段代码时,我得到一个模棱两可的返回值“1”。

这是 shell 脚本(因为我想问题可能源于这里):

#!/bin/bash
mysql -u XXXX -h XXXXX < XXXXX.sql
mysql -u XXXX -h XXXXX database < DEPLOY-HELPER.sql

关于为什么这不能从 Java 中正确执行的任何想法?

【问题讨论】:

  • 在你的 shell 脚本中打开 set -vx 并将 stderr 和 stdout 重定向到一个文件,这样你就可以看到发生了什么。首先猜测是您需要将路径设置为mysql。如需快速测试,请将mysql 替换为/full/path/to/mysql。祝你好运。
  • 你是在linux上运行它吗?此外,在 java 中调用进程,它可能无法正确设置路径或从系统导入变量。
  • @gigadot 是的,它在 Linux 上。我会试一试庇护所!谢谢。
  • 我阅读了有关使用 Java 进程运行脚本的文章可能会导致问题,因为您可能无法正确管道 stdout、stderr、stdin。他们推荐使用 Apache Exec 库,我发现运行外部进程很容易,因为它会为您处理输入和输出流。
  • 看起来@shelter 是在正确的道路上。拿到我的标准错误后,它显示它不知道我的 XXXX.sql 在第 2 行中的位置。

标签: java shell process


【解决方案1】:

如果你想运行一个 shell 脚本,你必须显式调用 shell 并将脚本的名称作为参数传递给它,如

bash /path/to/script/deploy.sh

Runtime.exec()ProcessBuilder 都不知道如何自己执行 shell 脚本,他们只知道如何执行二进制可执行文件。

【讨论】:

    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多