防止已运行的进程写入现有文件

防止已运行的进程写入现有文件

我有一个进程 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

例如,使用perlandFile::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对文件进行简单操作,则不需要重新启动。如果您更改了组成员身份等,则需要再次登录才能使更改生效。)

一般来说,您可以做的是将输出定向到管道,并让管道的读取端控制是处理(或转发)数据还是丢弃数据。 (不过,后来关于用例是某些设备文件的澄清使得这有点没有意义。)

相关内容