使进程读取相同文件名的不同文件

Ale*_*der 9 kernel system-calls files ld

我有一个读取文件的应用程序。我们称之为processname和文件~/.configuration。当processname运行时,它总是读取~/.configuration并且不能以不同的方式配置。还有其他应用程序依赖于“~/.configuration”,之前和之后,但不是在processname运行时。

在替换~/.configuration内容的脚本中包装processname是一个选项,但我最近断电(当内容被换出时),我丢失了所述文件的先前内容,所以这是不可取的。

有没有办法(也许使用与 远相关的东西LD_DEBUG=files processname?)来欺骗进程在尝试读取特定文件时读取不同的内容?在可执行文件中搜索和替换文件名有点侵入性,但应该也能工作。

我知道可以编写一个内核模块来接管open()调用(https://news.ycombinator.com/item?id=2972958),但是有没有更简单或更干净的方法?

编辑:在processname可执行文件中搜索~/.configuration 时,我发现它在读取~/.configuration之前尝试读取另一个文件名。问题解决了。

Sté*_*las 6

在最近版本的Linux,你可以取消共享安装命名空间。也就是说,您可以启动以不同方式查看虚拟文件系统的进程(安装不同的文件系统)。

这也可以用 完成chroot,但unshare更适合您的情况。

像 一样chroot,您需要unshare对 mount 命名空间具有特权的超级用户。

所以,假设你有~/.configuration~/.configuration-for-that-cmd文件。

您可以启动一个进程,它~/.configuration实际上是~/.configuration-for-that-cmd在那里绑定安装,并that-cmd在那里执行。

喜欢:

sudo unshare -m sh -c "
   mount --bind '$HOME/.configuration-for-that-cmd' \
                '$HOME/.configuration' &&
     exec that-cmd"
Run Code Online (Sandbox Code Playgroud)

that-cmd并且它的所有后代进程都会看到不同的~/.configuration.

that-cmd以上将作为 运行rootsudo -u another-user that-cmd如果需要作为another-user运行,请使用。