我有一个进程 P,它将内容写入文件 F。我需要能够动态启用/禁用 P 写入 F。我尝试更改用户/组的权限,但这需要重新启动该进程(事实上整个系统)。最后我应该能够执行一个执行以下操作的“脚本”:
EnablePWriteF
sleep 10
DisablePWriteF
因此,P 在前 10 秒内可以写入,之后就无法写入。我正在使用 Debian 发行版。
这可能吗?
更新:真正的用例是我试图过滤给定进程以写入特定设备文件 /dev/fb0 我有两个正在写入该文件的进程,我希望能够准确确定这两个进程之一允许在给定时刻写入该文件,而无需终止/停止进程。
答案1
至少在我的 Linux 版本上,看起来您可以使用强制锁。我只用 测试过它/dev/null
,但我看不出它不能与帧缓冲区等其他设备一起使用的任何原因:
作为根用户:
mount -t tmpfs -o mand locked-fb some-dir
cp -a /dev/fb0 some-dir/fb0-for-process-A
cp -a /dev/fb0 some-dir/fb0-for-process-B
chmod g+s some-dir/fb0-for-process-[AB] # enable mand-lock
例如,使用perl
andFile::FcntlLock
模块(或直接在 C 中执行):
#! /usr/bin/perl
use File::FcntlLock;
$l = new File::FcntlLock;
$l->l_type(F_RDLCK);
open my $fba, '<', 'some-dir/fb0-for-process-A' or die$!;
sleep 10; # writing OK
$l->lock($fba, F_SETLK); # writing blocked on fb0-for-process-A
sleep 10;
exit; # lock now released (or do an explicit unlock)
让一个进程通过该文件打开 fb0 设备fb0-for-process-A
,另一个进程通过fb0-for-process-B
并对这两个文件应用锁定来决定哪个进程可以在给定时间写入。
答案2
不,不是真的(据我所知)。仅当打开文件时才会检查文件访问权限(并且没有系统调用来撤销它们),所以如果进程有一个有写权限的文件句柄,那么它就有写权限。
(如果您chmod
对文件进行简单操作,则不需要重新启动。如果您更改了组成员身份等,则需要再次登录才能使更改生效。)
一般来说,您可以做的是将输出定向到管道,并让管道的读取端控制是处理(或转发)数据还是丢弃数据。 (不过,后来关于用例是某些设备文件的澄清使得这有点没有意义。)