Os processos em segundo plano no script ksh estão desaparecendo após serem iniciados

1

Estou tendo um problema com um script KSH que deve iniciar quatro processos paralelamente em segundo plano e, depois, pesquisar seu status.

Simplificando, executar os quatro processos sequencialmente levaria um bom tempo, e acho que posso economizar muito tempo executando-os em paralelo. Em teoria, não acho que isso seja difícil de realizar e escrevi o código abaixo. Todo processo é iniciado em segundo plano e seu pid é armazenado em uma variável.

Quando todos os processos forem iniciados, quero verificar cada pid usando ps -p $ PID para ver se o processo ainda existe. Caso contrário, sairá do loop e passará para o próximo. Isso será feito em seqüência.

Ponha de lado que eu ainda quero otimizar o fluxo sempre que possível, neste momento estou correndo em um problema muito persistente de meus processos desaparecerem. Eu inicio um processo em segundo plano, seu pid é atribuído à variável (e posso verificar se a variável correspondente está preenchida), mas se procurar o processo logo após usar esse mesmo PID, nada será retornado. O processo acabou.

Isso acontece com todos os 4 processos. Não executá-los em segundo plano (removendo assim o E comercial) não me dá nenhum problema; os comandos funcionam bem. Portanto, o problema parece ser específico para executar os comandos desejados como processos em segundo plano.

Se eu correr, por exemplo, um sleep 180 em segundo plano e armazenar seu PID de maneira semelhante e consultá-lo da mesma maneira, eu obtenho o resultado desejado.

Assim, posso executar os processos em primeiro plano e posso executar outros processos em segundo plano. É só que eu não sou capaz de executar esses processos específicos em segundo plano, por algum motivo não está claro para mim. A gravação de todas as saídas dos comandos que desejo executar em um arquivo de log retorna arquivos de log vazios. Usar set -x não mostra nada de estranho.

O script postado abaixo chama um script diferente que faz um número de verificações e, em seguida, chama um terceiro script que contém um grande número de funções. Não há absolutamente nada que eu possa encontrar até agora no script que indique isso causando problemas como este, e eu corro as mesmas linhas de comando que estou iniciando abaixo no fundo do shell diretamente, ele começa normalmente.

Então, basicamente, a situação é esta:
- Executar os comandos desejados no primeiro plano neste script funciona bem.
- Executar outro comando (como sleep) no segundo plano neste script funciona bem.
- Executar os comandos desejados no plano de fundo diretamente no shell funciona bem.
- Executar os comandos desejados em segundo plano neste script não funciona e não produz erros reconhecíveis.

Neste ponto, estou completamente perdido sobre o assunto. Alguém poderia me dar pelo menos uma vaga ideia de por que isso não funcionaria?

checkStatus(){
  LV_PID=${1}
  LV_COUNTER=0

  while (( ${LV_COUNTER} == 0 ))
  do
    ps -p ${LV_PID}
    if (( $? == 0 )); then
      ##continue loop
    elif (( $? == 1 )); then
      LV_COUNTER=1
    fi
  done
}

#################################################
#  Function: intendedFunction                   #
#################################################
intendedFunction(){
  nohup examplecommand.ksh -t exampletarget1 2> $HOME/log1.txt 1> /dev/null &
  export pid1=$!
  nohup examplecommand.ksh -t exampletarget2 2> $HOME/log2.txt 1> /dev/null &
  export pid2=$!
  nohup examplecommand.ksh -t exampletarget3 2> $HOME/log3.txt 1> /dev/null &
  export pid3=$!
  nohup examplecommand.ksh -t exampletarget4 2> $HOME/log4.txt 1> /dev/null &
  export pid4=$!

  echo "pid1 is $pid1"
  echo "pid2 is $pid2"
  echo "pid3 is $pid3"
  echo "pid4 is $pid4"

  checkStatus $pid1
  if (( 'wc -l < log1.txt' == 0 ))
  then
    #success
  else
    #error
  fi
  checkStatus $pid2
  if (( 'wc -l < log2.txt' == 0 ))
  then
    #success
  else
    #error
  fi
  checkStatus $pid3
  if (( 'wc -l < log3.txt' == 0 ))
  then
    #success
  else
    #error
  fi
  checkStatus $pid4
  if (( 'wc -l < log4.txt' == 0 ))
    #success
  else
    #error
  fi
    
por DyingFlutchman 12.01.2016 / 13:21

1 resposta

0

Eu acho que algo básico, como em um erro de digitação no nome do comando, ou examplecommand.ksh não encontrado no caminho.

As variáveis pid serão preenchidas por nohup, independentemente de qualquer coisa ser realmente executada, e se nohup falhar em executar o comando, ele sairá imediatamente. Além disso, nohup não vai incomodá-lo com qualquer uma dessas mensagens de erro irritantes, mesmo que isso falhe completamente.

[ksh]$ nohup nonexistent.ksh &
[1] 32938
appending output to nohup.out
[ksh]$ echo $!
32938
[1] +  Done(127)               nohup nonexistent.ksh &

PS. Você pode querer dar uma olhada em xargs. Como em

[ksh]$ seq 1 4 | xargs -n 1 -P 4 -I PART echo "part PART finished" 
part 2 finished
part 1 finished
part 3 finished
part 4 finished
    
por 24.04.2017 / 09:45

Tags