【问题标题】:Java Process return permission denied only sometime.Java 进程返回权限仅在某个时候被拒绝。
【发布时间】:2014-12-17 04:43:23
【问题描述】:

我正在从 Java 运行一个 shell 脚本。它大部分时间都有效,但偶尔会引发异常“权限被拒绝”

  PrintWriter writer = new PrintWriter(folder + cmdFile, "UTF-8");
    writer.println("#!/bin/bash");
    writer.println(commandLine.toString());
    writer.close();

    Process processUtil = Runtime.getRuntime().exec("/bin/chmod +x " + folder +  cmdFile );
    Process process = Runtime.getRuntime().exec(folder + "./" + cmdFile);
    try {
        int processResponseCode = processUtil.waitFor();

        processUtil = Runtime.getRuntime().exec("sleep 0.1s");
        processResponseCode = processUtil.waitFor();


        processResponseCode = process.waitFor();

        processUtil = Runtime.getRuntime().exec(" rm " + folder + cmdFile);
        processResponseCode = processUtil.waitFor();

异常

 java.io.IOException: Cannot run program "/tmp/./cmd755784": error=13, Permission denied 

知道是什么原因造成的吗?

【问题讨论】:

  • 它有正确的运行权限吗?
  • 如您在代码中看到的,我添加了该权限
  • 对我来说应该只是 chmod +x cmdFile 文件夹
  • 您是否有理由使用嵌入在 java 中的 shell 命令而不是使用内置的 File 对象?

标签: java bash process


【解决方案1】:

请检查是否有任何其他进程使用或持有正在删除的此目录/文件的句柄。用户 fuser 命令进行检查。根据 fuser 的输出,脚本应该等待更多时间并设置超时以处理其他异常情况。这不在问题的范围内,但您需要在以下方面改进您的编码:

  1. 编写一个可以参数的shell脚本,在这种情况下它们是文件夹路径和文件名
  2. 通过传递这些参数来调用 shell 脚本。
  3. 进程调用应该是异步的,这意味着应该在循环中或通过句柄/信号调用和等待进程以避免无限期等待。

PS:我建议不要使用 Java 中的任何脚本,除非没有其他方法。避免它。

【讨论】:

    【解决方案2】:

    /tmp 执行文件有时是个问题,因为/tmp 经常挂载noexec

    尝试从不同的目录运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-21
      • 2021-10-12
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      相关资源
      最近更新 更多