![如何更改流程的所有者?](https://linux22.com/image/899294/%E5%A6%82%E4%BD%95%E6%9B%B4%E6%94%B9%E6%B5%81%E7%A8%8B%E7%9A%84%E6%89%80%E6%9C%89%E8%80%85%EF%BC%9F.png)
嗨,我刚刚在 Ubuntu 上完成了一项技术测试,遇到了一个问题,我需要更改 PHP 进程的用户来修复损坏的网站。我相信用户是“foo”,但需要是“www-data”。最后我被告知“更改进程”是修复方法,我只是想知道如何做以供将来参考。
因此,这与更改文件用户权限的方法相同(我假设),但仅适用于进程。我搜索了又搜索,但我想知道我是否在寻找错误的命令?或者这是否会在某个配置文件中更改?
提前致谢!
答案1
在 Linux 中,无法从外部更改正在运行的进程的用户或组。您可以做的是更改正在运行的任何程序的配置,以便在下次运行时使用新用户。这取决于您如何安装和配置 PHP(或者更确切地说,无论您运行的是 PHP 还是 apache、php-fpm 等)。
答案2
你做不到,如果你能与我们分享的话,请查看此链接: https://stackoverflow.com/questions/37401774/change-owner-of-a-currently-running-process
答案3
这实际上是 Linux 内核的一个设计缺陷,即凭证更改仅发生在磁盘上,而不发生在内存中。具体来说,当凭证(UID、GID 或补充组列表)发生更改时,所有现有进程将继续使用其以前的凭证并享有对以前授予的数据的访问权限。并且没有一个 API 函数可以在整个系统(即所有进程)中传播凭证更改。由于这个缺陷,没有用户级程序可以做你想做的事情。你需要一个内核模块来做到这一点。我刚刚尝试制作一个,它适用于简单的程序。(https://github.com/xuancong84/supgroup)
但是,通常这样做并不是一个好主意,因为通常程序可以有很多交互,例如打开的文件句柄、在其他 CPU 核心上运行的子进程/线程、绑定的管道、打开的设备等。因此,在运行时更改 UID/GID 可能导致许多未定义的行为,其中一些可能导致错误(例如管道损坏、I/O 通信中止),一些则可能变得危险(例如系统崩溃)。我已经测试过这个程序在简单程序(例如nc -l 8080
)上运行良好,但在一个在许多 CPU 核心和 GPU CUDA 核心上运行许多线程的更大更复杂的程序上,由于网络活动和磁盘 I/O 活动繁重,我不确定会发生什么。