【发布时间】:2012-05-07 20:06:49
【问题描述】:
我有两个要同步的进程。
进程 A 以 root 身份运行并在特定文件上创建可重入锁。 进程 B 在“普通”用户下运行,应该等待进程 A 释放锁。
我尝试了很多方法,但由于文件权限错误,无法使其正常工作。 这是代码: (删除了虚拟机内同步的东西):
锁定:
FileChannel channel = new RandomAccessFile(pFile, "rw").getChannel();
lock = channel.tryLock();
有锁:
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)
我试图将目录隐藏到所有 g=rwx,o=rwx 但这似乎被忽略了。我尝试先创建文件 setWritable(true, false) 但这似乎已重置。我没有任何方法可以工作。我尝试在 hasLock 中使用模式“r”而不是“rw”,但这会导致 ChannelNotWritableException。
所以主要问题是:如何影响创建的锁文件的权限?
有人有什么建议吗?
问候迈克尔
【问题讨论】:
-
我过去所做的是通过为数据文件中的所有记录建立一个索引文件来避免对锁的需求。这允许进程之间的并发访问(前提是你只有一个作家)
-
我不需要写任何东西。我只需要检查其他进程是否仍在运行(持有锁)。对于一些“等到完成”的方法。我在一个无状态的 web 服务中,它必须在启动其他断开连接的进程时使进程死亡。我可以猜出文件名,因为这是可以用参数构造出来的。
标签: java permissions locking nio