Você pode fazer o plano de fundo de uma só vez assim:
sudo -u user sh -c "daemon & disown %1"
A análise com ps mostrará que daemon está sendo executado como user . Não haverá sudo associado a ele.
Percebi que sudo continua a ser executado após a execução de qualquer uma das seguintes linhas. Existe alguma maneira de desanexar o daemon completamente, então sudo não continua sendo executado?
sudo -u user daemon &
sudo -u user -b daemon
sudo não permanece em execução depois de executar o programa solicitado; na verdade, ele usa a chamada do sistema exec() para substituir-se pelo programa que você especifica para que o programa tenha o mesmo PID que sudo fez. Você pode verificar isso executando os seguintes comandos:
sudo -u user -b sleep 60
ps aux | grep sudo
ps aux | grep sleep
Você verá que o sono ainda está em execução, mas o sudo não está.
Se você solicitar ao shell sudo com o operador & , o sudo irá bloquear e aguardar no fundo indefinidamente se ele solicitar sua senha. Se ele não solicitar sua senha, o programa especificado será executado e sudo não estará mais em execução. Devido ao potencial de bloqueio, a opção -b para sudo é o método preferencial, portanto, ele pode solicitar sua senha, se necessário, e, em seguida, será transferido para o plano de fundo para executar o programa solicitado.
Desculpe, isso não é realmente uma resposta, é mais um comentário adicional.
Apesar da resposta do psusi, parece que algumas versões do sudo serão sempre fork() (e aguardará o processo filho se -b não for especificado).
O problema com o uso de -b é que $! não contém o PID do daemon;
o problema com o uso de daemonize é que ele não é enviado com todas as distribuições;
o problema com o uso de sudo sh -c 'run_my_daemon arg1 arg2 arg3... & save_pid $!' é que passar args para run_my_daemon é bastante contorcido; ficar longe de tais contorções é um dos principais motivos para usar o sudo em primeiro lugar.
Preocupar-se com a espera por uma senha só se aplica se você não for root para começar; em particular, considere o caso de usar sudo -u $run_as_uid prog "${args[@]}" dentro de um script que já está sendo executado como root.
Se você tiver o programa daemonize , poderá usar sudo daemonize PATH_TO_DAEMON .