【问题标题】:Execute sh file from Java从 Java 执行 sh 文件
【发布时间】:2013-02-20 18:25:07
【问题描述】:

我正在尝试通过以下代码执行一个 sh 文件(顺便说一句,CentOS 机器)

Runtime.getRuntime().exec("sh " + file.getPath());

我将此代码用于 Windows,它工作正常

Runtime.getRuntime().exec("cmd /c start " + file.getPath());

可能是因为我在 .sh 文件中使用了 Screen 吗?我也在使用 java 命令来启动服务器,所以也许我需要包含这些?

这里是sh文件的内容

#!/bin/sh
BINDIR=$(dirname "$(readlink -fn "$0")")
cd "$BINDIR"
screen -S PrivateServer java -Xms2048M -Xmx2048M -jar somejar.jar -o true

我也在从关闭挂钩运行此代码,这可能是问题吗?这是因为该软件是一个游戏服务器,它的目的是让用户可以使用重启命令或让它自动重启,而无需自己设置任何东西。

编辑:我决定将错误输出到一个文本文件,发现这个“必须连接到终端”。有任何想法吗?我认为这是与使用屏幕有关的问题。

【问题讨论】:

  • 你确定你的文件是可执行的(例如chmod +x filename)?另外,考虑使用getRuntime().exec(new String[] {"sh",file.getPath()});
  • 也许 shell 没有正确解析你的命令行。 file.getPath() 的值是多少?检查文件是否在合适的环境(路径等)下运行。尝试一个简单的 sh 文件(例如,一个只记录它运行的文件)。
  • @iTech 是的,当我从控制台执行该文件时,该文件是可执行的
  • @TedHopp 会的,这可能与我在关闭挂钩中运行它有关吗?这意味着启动另一个程序,该程序将保持打开状态,直到终止。这旨在作为服务器命令,以便用户可以通过命令重新启动服务器。
  • 尝试将-t 添加到sh 命令serverfault.com/questions/21806/…

标签: java linux sh execute gnu-screen


【解决方案1】:

既然您确认文件有可执行权限,请尝试按如下方式传递参数:

Runtime.getRuntime().exec(new String[]{"/bin/sh" ,"-c", file.getPath()});

所以主要提供sh的完整路径并使用-c

【讨论】:

  • 如果在脚本中我只是简单地创建一个目录但它似乎不喜欢屏幕命令,它似乎可以工作,也许我需要包含或使用屏幕的确切位置?跨度>
  • 我终于找到了错误,决定把它输出到错误日志中,发现这个“必须连接到终端”。那么我该如何解决呢?
【解决方案2】:

您需要设置操作的权限,通常“sh”文件需要执行权限才能从 Java 应用程序运行此脚本。您必须以 root (sudo su) 或 sudo java -jar 身份运行 Java 应用程序。或者设置对脚本“sudo chmod 777 ...”的完全访问权限,不是完全访问权限,但对于任何想要执行脚本的用户来说至少 chmod +x。

最好的问候。

【讨论】:

    【解决方案3】:

    我建议使用 org.apache.commons.exec.* 来运行。

    【讨论】:

    • 你有示例代码吗?我似乎找不到太多文档
    【解决方案4】:

    好像没有可执行权限,在执行shell脚本之前尝试执行"chmod +x shell_script_filename"

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 1970-01-01
      • 2012-11-24
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2013-03-03
      • 1970-01-01
      相关资源
      最近更新 更多