Java 程序无法执行它写入/tmp 的文件,没有这样的文件或目录

标签 java linux ubuntu

我遇到了一个 java 程序的问题,它试图将文件写入 Ubuntu 18.10 上的 /tmp 目录。它遇到错误,因为它无法写入它期望的临时文件。错误 2 失败:没有这样的文件或目录。 /tmp 上的权限是默认的。

我读到这不是 Windows 或 Mac OS 的问题,因为它不会以这种方式受到限制。

我该如何解决这个问题?我应该以不同方式(首选)配置我的系统还是更改代码?

编辑:

有问题的文件实际上是创建的,权限是 -rwxrwxr-x 1 lucas lucas 51263 4 月 26 日 11:12 monalisa13902330713449850714bin*

但是,程序找不到它:

monalisa.tools.tinv.TInvariantCalculator$InvokeProcessException:java.io.IOException:无法运行程序“/tmp/monalisa13902330713449850714bin”(在目录“/tmp”中):错误=2,没有这样的文件或目录

/tmp 目录由 File(System.getProperty("java.io.tmpdir")); 正确确定

文件创建于此:

    toolFile = FileUtils.extractResource("tinv_unix", "monalisa", "bin");
    public static File extractResource(URL resource, String prefix,
            String suffix) throws IOException {
        LOGGER.debug("Extracting resource '" + resource.toString() + "'");
        File file = File.createTempFile(prefix, suffix);
        file.setExecutable(true, false);

运行 exec/tmp/[file name] 返回同样的错误。

编辑:“strace -e stat,execve -f bash -c/tmp/monalisa1846113800189529428bin”的结果

`

execve("/bin/bash", ["bash", "-c", "/tmp/monalisa1846113800189529428"...], 0x7ffdb3fa2b68 /* 59 vars */) = 0
stat("/home/lucas", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/lucas", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/tmp/bin/bash", 0x7ffdd5b7b7d0)   = -1 ENOENT (No such file or directory)
stat("/usr/local/sbin/bash", 0x7ffdd5b7b7d0) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/bash", 0x7ffdd5b7b7d0) = -1 ENOENT (No such file or directory)
stat("/usr/sbin/bash", 0x7ffdd5b7b7d0)  = -1 ENOENT (No such file or directory)
stat("/usr/bin/bash", 0x7ffdd5b7b7d0)   = -1 ENOENT (No such file or directory)
stat("/sbin/bash", 0x7ffdd5b7b7d0)      = -1 ENOENT (No such file or directory)
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=1121696, ...}) = 0
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=1121696, ...}) = 0
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=1121696, ...}) = 0
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=1121696, ...}) = 0
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=1121696, ...}) = 0
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=1121696, ...}) = 0
execve("/tmp/monalisa1846113800189529428bin", ["/tmp/monalisa1846113800189529428"...], 0x55d86a4d0960 /* 59 vars */) = -1 ENOENT (No such file or directory)
stat("/tmp/monalisa1846113800189529428bin", {st_mode=S_IFREG|0744, st_size=51263, ...}) = 0
stat("/tmp/monalisa1846113800189529428bin", {st_mode=S_IFREG|0744, st_size=51263, ...}) = 0
stat("/tmp/monalisa1846113800189529428bin", {st_mode=S_IFREG|0744, st_size=51263, ...}) = 0
stat("/tmp/monalisa1846113800189529428bin", {st_mode=S_IFREG|0744, st_size=51263, ...}) = 0
bash: /tmp/monalisa1846113800189529428bin: No such file or directory
+++ exited with 127 +++`

最佳答案

我敢打赌你的/tmp 目录挂载为 noexec - 这意味着你不能在那里执行任何程序。

可能的解决方案:写入其他地方(也许是用户的主目录?)或从/etc/fstab 中删除 noexec 以获取/tmp 并重新挂载 - 但请确保在执行此操作之前理解这意味着什么。

关于Java 程序无法执行它写入/tmp 的文件,没有这样的文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55899245/

相关文章:

java - 如何在给定整个源文件的情况下打开现有 Java 项目

linux - 增加 ubuntu 磁盘大小的问题(virtualbox 镜像)

java - 在 Java 中查找所有可能的 'StringPairGroups' 的算法?

java - Jenkins:在没有描述符的类上使用 validateButton

linux -/proc/net/tcp 中 tx_queue & rx_queue 的单位

python - 设置环境变量,使其可以在我的程序之外读取

python -/usr/bin/ld : cannot find -lpython3. 5m

Bash:除了更新语言环境之外,通过导出设置的语言环境有什么不同吗?

mysql - 如何在 Amazon EC2 上的 ubuntu 上设置和配置 mysql-proxy

java - 理解java中的设计模式