Linux为什么不执行具有Java执行权限的bash脚本?

问题描述 投票:1回答:1

[有许多看起来与此类似的问题,但是似乎没有一个完全相同,并且所有解决方案都不适用于我,所以就这样...

我有一个Java程序,试图自动更新自身。它是这样的:

  • 启动时,bash脚本检查在特定位置是否存在zip文件。
  • 如果存在,则不运行“真正的”主类,而是运行更新程序Java类。
  • 此类将在临时位置解压缩zip,然后从该临时位置以单独的过程重新开始。
  • 一旦新进程开始,旧进程退出。
  • 新过程尝试将zip再次解压缩到先前的位置(该位置现在没有任何运行,因此可以替换)。>>
  • 成功后,它将删除zip文件并再次运行原始bash脚本。
  • 如果一切正常,那么bash脚本现在将只启动Java主类。

此列表中的所有内容实际上都能正常工作,但当我尝试最后执行bash脚本的最后一步时除外。

bash文件权限如下所示(在运行自动更新之前和之后):

-rwxr-xr-x

据我所知,运行该文件应该没有权限问题(实际上,我可以在进程崩溃后立即手动运行它。)>

这是我得到的错误:

java.io.IOException: Cannot run program "/home/xxx/build/image/bin/run": error=13, Permission denied
at java.base/java.lang.ProcessBuilder.start(Unknown Source)
at java.base/java.lang.ProcessBuilder.start(Unknown Source)
at java.base/java.lang.Runtime.exec(Unknown Source)
at java.base/java.lang.Runtime.exec(Unknown Source)
at java.base/java.lang.Runtime.exec(Unknown Source)
at my_mod/my.Main.main(Unknown Source)

我写了一个类似的“过程炸弹”,但是起作用了:

  • 通过运行启动主类的bash脚本开始
  • 主类使用以下代码再次启动bash脚本:

    // DO NOT RUN THIS AT HOME!
    // IT WILL START LOTS OF PROCESSES INFINITELY
    // if you do want to try it, have "killall -9 java" ready!
    try {
        Runtime.getRuntime().exec( path )
        System.exit(0);
    } catch ( Exception e ) {
        e.printStackTrace();
    }
    
  • 所以我认为这不是针对这种过程炸弹的Linux保护。

    但是令我完全困惑的是,为什么Linux在更新后仍然拒绝访问运行该bash脚本。

我的操作系统是Ubuntu 19。

我如何找出为什么它拒绝访问,更重要的是,我该如何解决它?

[看起来有很多类似的问题,但是似乎没有一个完全相同,并且所有解决方案都不适用于我,所以就这样...我有一个Java程序...

java linux filesystems
1个回答
0
投票

我终于找到了问题的根本原因:这是由于文件权限引起的,但是不是文件中的错误消息提到了

© www.soinside.com 2019 - 2024. All rights reserved.