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
.