JavaNIO:检查root用户从正常用户下运行的进程创建的文件锁?

时间:2012-05-07 20:06:49

标签: java permissions locking nio

我有两个我要同步的过程。

进程A以root身份运行,并在特定文件上创建Reentrant-Lock。 进程B在“普通”用户下运行,并应等待进程A释放锁。

我尝试了很多方法,但由于文件权限错误导致无法正常工作。 这是代码: (删除了in-VM-synchronization-stuff):

锁定:

FileChannel channel = new RandomAccessFile(pFile, "rw").getChannel();
lock = channel.tryLock();

hasLock:

RandomAccessFile file = new RandomAccessFile(pFile, "rw");
FileChannel channel = file.getChannel();
FileLock lock = channel.tryLock();
if (lock == null) {
 return true;
}
lock.release();

我遇到的问题是锁被创建为:

-rw-r--r--. 1 root root 0 May  7 21:42 lockfile.lock

如果我尝试检查锁定(通过进程B作为普通用户运行),我得到一个

java.io.FileNotFoundException: _lockfile_ (Permission denied)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212)

我试图将目录umask到所有g = rwx,o = rwx,但这似乎被忽略了。我试图先创建文件,setWritable(true,false),但似乎重置了。我没有任何方法可以工作。我试图在hasLock中使用模式“r”而不是“rw”,但这会导致ChannelNotWritableException。

所以主要问题是:如何影响创建的锁文件的权限?

有人有什么建议吗?

问候迈克尔

2 个答案:

答案 0 :(得分:3)

您违反了根进程的umask,它掩盖了您在创建文件时提供的“rw”,拒绝对groupothers的写入权限。除了更改根umask之外,你无能为力,这是出于安全原因这是一个非常糟糕的想法。

您应该考虑永久存在锁定文件,或者像Peter建议的那样,使用已经作为应用程序一部分的文件作为锁定文件。

答案 1 :(得分:2)

最后我得到了一个解决方案:

首次创建文件的方法是正确的。我犯的错误是我在创建文件之前设置了权限(期望权限存储在文件对象中并在创建时使用)。我必须先创建文件,然后将权限设置为all,然后将其锁定:

file.createNewFile();
file.setWritable(true, false);
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
channel.tryLock()

现在使用worlwide-writable创建了lockfile(这可能是一个安全问题,但实际上没有问题可见,因为该文件不包含任何内容。

感谢大家帮我找到解决方案!

问候迈克尔