Liberar o controle para a linha de comando, uma vez que o processo bifurcado seja concluído

0

Eu sou novo na programação de script de shell do Linux e escrevi um script como abaixo ..

O Script é executado corretamente, mas depois que o programa terminar e os ecos que o programa completou, eu tenho que pressionar manualmente [ENTER] no meu teclado para obter o prompt da linha de comando. Por que meu script se comporta assim?

O que devo fazer para que, quando o processo filho for concluído, e o script repetir que o programa foi concluído, o controle será retornado à linha de comando e receberei o prompt de linha de comando sem ter que fazer nada?

#!/bin/ksh    
echo "program running..."

funcall(){    
  nohup <<command_name>> $program >/dev/null 2>&1      
  pid = $!      
  wait pid      
  echo "program completed..."      
  exit 
}

fork(){
  funcall &
}
fork
    
por linux_usr 19.04.2017 / 07:54

3 respostas

2

É altamente incomum que um processo forjado aguarde por si mesmo.

O fluxo de controle deve ser

  1. bifurcar o processo
  2. processo filho faz o seu trabalho
  3. 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:

  1. pid é usado como uma variável, mas deve ser $pid .
  2. 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..."      
    
por 19.04.2017 / 08:40
1

Após o processo ser concluído, você já está no prompt de comando, mas o prompt em si é obscurecido pela saída da parte em segundo plano do script.

Apertar enter irá rodar qualquer comando que você tenha digitado na linha de comando (provavelmente nada) e então imprimir o prompt novamente, aparentemente "trazendo o seu prompt de volta".

Para limpar sua tela depois de obter uma saída dispersa, pressione Ctrl-L.

    
por 19.04.2017 / 08:26
0

Altere o código de funcall& para funcall . Como o funcall está sendo executado em segundo plano, o processo pai , ou seja. seu script está aguardando para concluir o processo filho.

Se você executar o funcall em primeiro plano, o seu programa saiu normalmente.

    
por 19.04.2017 / 08:40

Tags