我注意到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
.