A resposta correta para isso foi que para "daemonização" adequada, entrada padrão, saída padrão e erro padrão precisam ser redirecionados para / dev / null (ou algum arquivo real):
su someuser -c "nohup some_script.sh >/dev/null 2>&1 &"
su - substitua a identidade do usuário pelo argumento someuser
-c - su para executar o comando especificado
nohup - Execute um comando imune a restrições. Para evitar casos em que o processo pai terminará o processo filho. Adicionado aqui apenas no caso. Mas na verdade não tem efeito no meu caso particular. Se é necessário depende do ambiente (verifique shopt )
> / dev / null - Reduza a saída padrão para nada, basicamente desabilitando-a.
< strong> 2 > & 1 - Redirecionar erro padrão (2) saída para a saída padrão (1), que é redirecionada para null
& - desanexar para o plano de fundo. redireciona a entrada padrão também para / dev / null.
Isto é essencialmente exatamente o que o utilitário start-stop-daemon do Debian dpkg faz em seu núcleo. É por isso que prefiro iniciar scripts dessa maneira, em vez de introduzir outra chamada de utilitário externo no meu código. O start-stop-daemon é útil nos casos em que você possui programas daemon completos que você precisa iniciar e onde você precisa de funcionalidades adicionais que o start-stop-daemon fornece ( por exemplo, verificar se o processo especificado já está sendo executado para que não seja iniciado novamente).
Também é importante notar que você também pode fechar os descritores de arquivo do seu processo em vez de redirecioná-los para / dev / null , por exemplo:
su someuser -c "some_script.sh 0<&- 1>&- 2>&- &"
0 < & - Fecha a entrada padrão (0)
1 > & - Fecha a saída padrão (1)
2 > & - Fecha a saída do erro padrão (2)
A direção de < > sinais não importa, pois o número descritor de arquivo longo é especificado. Então, isso é igualmente bom:
su someuser -c "some_script.sh 0>&- 1>&- 2>&- &"
ou
su someuser -c "some_script.sh 0<&- 1<&- 2<&- &"
No entanto, há uma maneira um pouco mais curta de escrever isso, sem números para stdin e stdout, onde a direção importa:
su someuser -c "some_script.sh <&- >&- 2>&- &"
Quando os descritores de arquivo são fechados ou redirecionados para / dev / null (o start-stop-daemon está fazendo o redirecionamento para / dev / null), o processo é seguro para ser executado em segundo plano como um daemon. Então, isso é o que é necessário para evitar problemas ( startpar ) com o lançamento de scripts durante o tempo de inicialização.
Implementei toda a solução da minha ideia inicial e a coloquei no GitHub: link