Como parar um processo de segundo plano iniciado no mesmo script, sem sair do script?

5

Eu tenho um programa que leva um tempo variável para ser executado (não mais do que dois minutos), e para torná-lo menos odioso, eu coloco mensagens da sorte.

 #!/bin/bash
 ...
 for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
 ...

No entanto, a duração do programa pode variar (dependendo de fatores que são irrelevantes aqui) e precisa parar as mensagens.

 #!/bin/bash
 ...
 for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
 ...
 if [any-condition]; Then
      #script is over... Stop messages!!!
 fi
 ...
 if [any-condition]; Then
      #Stop messages... script continue execution
 fi
 ... Blah blah
 ...
 #script is over stop Messages!

Portanto, se eu preparar 45 mensagens em períodos de 3 segundos, o programa poderá terminar em breve, mas as mensagens ainda aparecerão no terminal, interferindo em outro trabalho.

Eu tento com o comando jobs , mas não há trabalhos em segundo plano. Tente com o comando ps , mas não conseguiu encontrar a tarefa de mensagens.

Como parar essas mensagens da fortuna?

    
por Alejandro Salamanca Mazuelo 05.06.2015 / 19:07

1 resposta

3

A maneira mais simples é usar $! . Esse é o PID do último processo lançado em segundo plano (de man bash ):

!

Expands to the process ID of the job most recently placed into the background, whether executed as an asynchronous command or using the bg builtin.

Então, você poderia fazer algo como:

for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
pid=$!

[ main script here]

if [any-condition]; then
  kill $pid
fi

No entanto, não posso deixar de pensar que esta é uma maneira bastante complicada de fazer as coisas. Eu poderia lhe dar um exemplo mais específico se você mostrasse todo o seu roteiro, mas por que não algo como:

long_process &
while ps -p $! >/dev/null; do sleep 3; echo; echo; fortune; done 

Isso permitiria que você iniciasse qualquer processo que demorasse tanto e executaria fortune até o fim.

    
por 05.06.2015 / 19:53