É altamente incomum que um processo forjado aguarde por si mesmo.
O fluxo de controle deve ser
- bifurcar o processo
- processo filho faz o seu trabalho
- o pai faz a sua coisa e aguarda
Isso se traduziria em algo como
#!/bin/ksh
echo "program running..."
funcall () {
nohup some_command "$program" >/dev/null 2>&1
echo "program completed..."
}
fork () {
funcall &
}
fork
child_pid="$!"
wait "$child_pid"
Observe que a chamada em segundo plano da chamada para funcall
e a espera pela chamada da função a retornar é totalmente desnecessária nesse caso, pois a função fork
não está fazendo nada enquanto funcall
está em execução.
O que seu código faz é iniciar o filho em segundo plano e retornar imediatamente o controle ao shell pai. O prompt pode estar um pouco confuso com a saída do script.
Note que você também tem alguns erros no seu script:
-
pid
é usado como uma variável, mas deve ser$pid
. - A atribuição a
pid
não deve ter espaços em torno de=
.
Além disso, o exit
não é necessário.
O script aparado que faz o que você precisa é
#!/bin/ksh
echo "program running..."
nohup some_command "$program" >/dev/null 2>&1
echo "program completed..."