使用 sudo 分离守护进程?

使用 sudo 分离守护进程?

我注意到sudo执行以下任何行后继续运行。有没有办法完全分离守护进程,使其sudo不再继续运行?

sudo -u user daemon &
sudo -u user -b daemon

答案1

您可以像这样一次性将其设置为背景:

sudo -u user sh -c "daemon & disown %1"

查看ps将显示daemon正在运行user。不会有sudo与之相关的。

答案2

sudo在执行您要求的程序后不再保持运行状态;事实上,它使用exec()系统调用将自身替换为您指定的程序,以便该程序具有相同的 PID sudo。您可以通过运行以下命令来验证这一点:

sudo -u user -b sleep 60
ps aux | grep sudo
ps aux | grep sleep

您会看到 sleep 仍在运行,但 sudo 没有运行。

如果您要求 shell 使用&操作符将 sudo 置于后台,那么 sudo 将在后台无限期地阻塞并等待(如果它必须提示您输入密码)。如果它没有提示您输入密码,则您指定的程序将运行并且sudo不再运行。由于存在阻止的可能性,因此 -b 开关sudo是首选方法,因此它可以在需要时提示您输入密码,然后它将分叉到后台运行所请求的程序。

答案3

抱歉,这并不是真正的答案,更多的是附加评论。

尽管 psusi 做出了回应,但似乎某些版本sudo将始终(如果未指定,fork()则等待子进程)。-b

使用的问题-b是 then$!不包含守护进程的 PID;使用的问题daemonize是它不是随所有发行版一起提供的; using 的问题sudo sh -c 'run_my_daemon arg1 arg2 arg3... & save_pid $!'在于将 args 传递给 torun_my_daemon是相当扭曲的;摆脱这种扭曲是首先使用 sudo 的主要原因。

仅当您一开始就不是 root 时,才需要担心等待密码;特别要考虑sudo -u $run_as_uid prog "${args[@]}"在已经以 root 身份运行的脚本内部使用的情况。

答案4

如果您有该daemonize程序,则可以使用sudo daemonize PATH_TO_DAEMON.

相关内容