Minha investigação sobre isso me levou a uma solução. Então agora eu sei como fazer isso corretamente, mas eu ainda não entendi porque startpar se comportou como aconteceu. Então, se alguém está disposto a intervir e explicar isso, estou mais do que disposto a aceitar essa resposta do que esta.
Basicamente, o problema é que eu chamei os scripts sem redirecionar (ou fechar) entrada padrão, saída padrão e erro padrão para um arquivo ou para / dev / null e, por algum motivo, startpar ( "usado para executar vários scripts de nível de execução em paralelo" processo, que para mim é o que inicia outros processos durante a inicialização, foi bloqueado neste meu script por causa disso. Ele lançou meu script, mas ele próprio não terminou de ser executado e foi deixado no estágio mostrado na lista de processos como:
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 3048 1 0 1024 620 1 20:04 ? 00:00:00 startpar -f -- rc.local
O código-fonte de startpar está aqui: link
Folheei e fiz minha análise inicial em uma nova pergunta que publiquei no stackoverflow. Encontre o link na UPDATE que adicionei à minha pergunta aqui.
A solução final que usei é esta:
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.
Olhando os descritores de arquivo de outros daemons conhecidos em execução no meu sistema, vejo que o redirecionamento para / dev / null é uma coisa comum. E apenas alguns processos daemon na verdade fecharam stdin, stdout, stderr. O que poderia ser alcançado por exemplo:
su someuser -c "some_script.sh 0<&- 1>&- 2>&- &"
Em um sentido prático, é tudo a mesma coisa e é necessário (qualquer opção) separar de maneira limpa um processo como um daemon em segundo plano.