有没有办法在不输入管理员密码的情况下终止 root 进程?
你可能想知道为什么我要这样做,因为这听起来很可疑。好吧,我只需要结束由代理的守护进程启动的进程,但守护进程以 root 身份运行,而代理是特定于用户的。
答案1
你应该调查一下sudo
。
您可以将其配置为让您输入任何没有密码的命令,或者只是输入一些类似的命令kill
,或者在每个命令上询问您的用户密码(不是root,而是您的),等等。它非常灵活。
它可能已在您的系统上安装并设置。例如,Ubuntu 和 OS X 就是这种情况。如果没有,它适用于大多数 Unixy 系统。
答案2
用户只能杀死自己的进程或以其他方式发出信号。
您说该进程是由以 root 身份运行的守护进程启动的。该进程是否也需要以 root 身份运行?如果没有,请让它放弃权限并以所需的用户身份运行。
如果进程必须以 root 身份运行,则必须为代理提供一种方法来提升其权限以终止该进程。这可以采用 setuid root 帮助程序可执行文件的形式,或sudoers
文件中的条目(带有NOPASSWD
标记)。 sudo 条目的优点是它的使用会被记录。
请注意,没有原子方法可以向进程发送信号。发送一个信号是异步:有可能你获得了一个进程的PID,然后向该进程发送了一个信号,但该进程在此期间已经死亡,并且其进程ID已被另一个进程重用。
有一种方法可以避免这种情况,涉及到您想要终止的进程的父进程,但它很复杂。进程 ID 不会消失,直到其父进程确认子进程死亡(a僵尸进程保留到那时)。为了有效地使用这一点,你需要父母知道它必须坚持下去,直到没有代理人想要杀死孩子。
如果您不关心竞争条件,pkill name_of_process_to_kill
并且知道将有一个具有该名称的进程,则可以授予代理运行权限。如果您可以通过打开的文件来识别进程,则可以使用fuser -k /path/to/file
.
如果可以,请修改进程,以便它侦听管道或套接字上的终止请求。根据您的需要在管道或套接字上设置权限或身份验证。