当前位置: 首页 > 面试题库 >

无法使用java.nio.channels.FileLock在Linux上锁定文件

颛孙铭
2023-03-14
问题内容

我正在用Java创建一个应用程序,对于该应用程序我只希望运行一个实例。为此,我创建了一个文件,并在我的应用程序运行时锁定了它。

我有以下代码可在Windows上运行,但在Linux上无法运行:一旦我获得了一个锁而没有将其解锁,则可以再获得一个锁。

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class MyApp {

private static File f;
private static FileChannel channel;
private static FileLock lock;

public static void main(String[] args) {
    try {
        f = new File("RingOnRequest.lock");
        // Check if the lock exist
        if (f.exists()) {
            // if exist try to delete it
            f.delete();
        }
        // Try to get the lock
        channel = new RandomAccessFile(f, "rw").getChannel();
        lock = channel.tryLock();
        if(lock == null)
        {
            // File is lock by other application
            channel.close();
            throw new RuntimeException("Only 1 instance of MyApp can run.");
        }
        // Add shutdown hook to release lock when application shutdown
        ShutdownHook shutdownHook = new ShutdownHook();
        Runtime.getRuntime().addShutdownHook(shutdownHook);

        //Your application tasks here..
        System.out.println("Running");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
    catch(IOException e)
    {
        throw new RuntimeException("Could not start process.", e);
    }

}

public static void unlockFile() {
    // release and delete file lock
    try {
        if(lock != null) {
            lock.release();
            channel.close();
            f.delete();
        }
    } catch(IOException e) {
        e.printStackTrace();
    }
}

static class ShutdownHook extends Thread {

    public void run() {
        unlockFile();
    }
}

}

问题答案:

我使用了与您相同的示例,并且在Mac OS
X上遇到了同样的问题。似乎文件锁定不能防止在POSIX系统上删除文件。在解锁之前,您的应用仍会对该文件具有某种处理方式。因此,请考虑使用名称为PID的锁定文件(或内部文件)。



 类似资料:
  • 我在Linux(Ubuntu)机器上运行IntelliJ IDEA 2017.1.6 Pro,它不会让我为任何Java项目选择SDK。 我试着指定位置: /usr/lib/jvm/ /usr/lib/jvm/java-11-openjdk-amd64/ /usr/lib/jvm/java-8-openjdk-amd64/ /usr/lib/jvm/openjdk-11/ /usr/lib/jvm/

  • 问题内容: 我在应用程序中使用selenium-server,selenium rc进行UI测试。我的开发箱是带有FireFox 3.5的Windows,一切运行正常。但是当我尝试在我的构建服务器(是linux机器)上运行selenium测试时,出现此错误 基本上,selenium-rc无法在Linux(实际上是.sh文件)上找到Firefox可执行文件,在Windows中是存在的。 有人遇到过这

  • 无法在linux上使用ElasticSearch映射logstash 我只是运行下面的命令,它显示了docker上所有正在运行的图像 sudo docker ps 输出: 我只想将logstash链接到弹性搜索并尝试运行以下命令 命令: 输出: 989e2a8f4d9fd972c4f2102d726a68877c989b546800899abbb8c382fb62f04c logstash。形态:

  • 问题内容: 在Bash中,我试图使函数getLock与不同的锁名一起使用。 但是羊群说 如何仅锁定文件并在需要时释放它,而不必在集群中执行命令? 它的用法如下: 问题答案: 锁定文件: 释放锁: 您也可以按照羊群手册页中的描述进行操作: …在这种情况下,文件退出时文件会自动关闭。(在这里也可以通过使用而不是来使用子外壳,但这应该是一个有意的决定- 因为子外壳会降低性能,并且会影响范围变量的修改和其

  • 问题内容: 我们的一位客户正在使用某些Novell安全软件,有时会锁定我们的软件创建的某些.class文件。发生这种情况时,这会给他们带来一些麻烦的问题,我正在尝试研究一种变通办法,我们可以将其添加到错误处理中以解决此问题。我想知道java api中是否有任何调用可用于检测文件是否已锁定,如果已锁定,则将其解锁。 问题答案: 在尝试写入文件之前,您可以使用File.canWrite()检查Java

  • 我正在使用ApacheCamel文件组件从本地目录读取数据并上传到AWS S3存储桶。这条路线在过去工作得很完美,但现在每天都有一些文件出现问题。 在我迄今为止的调试调查(3天的痛苦)中,我发现该路由到达了类,并且在交换上没有设置任何异常(供参考,请参阅下面前面提到的类的相关代码)。考虑到没有任何异常,我似乎无法弄清楚为什么方法从不针对特定文件触发。有问题的文件没有/没有任何异常;但是,在所有逻辑