Como controlar uma subcamada em segundo plano?

1

Se eu executar o seguinte comando em um prompt bash:

(for i in {1..100}; do echo $i; sleep 1; done) &

Ele começará a contar e retornará imediatamente ao meu prompt. Eu posso continuar trabalhando normalmente, mas a cada segundo ele vai imprimir um novo número em cima do que eu estou trabalhando. Eu posso ver o trabalho em jobs e fg / kill como esperado.

Agora, se eu mover este comando para o seguinte script, test.sh :

#!/usr/bin/bash
(for i in {1..100}; do echo $i; sleep 1; done) &

e eu corro ./test.sh , acontece a mesma coisa - mas o trabalho não é mais exibido em jobs e não posso mais fg . Por que exatamente o segundo comportamento é tão diferente do primeiro, e como alguém poderia controlar o segundo trabalho (não encontrar o PID e matá-lo dessa maneira)?

    
por smitelli 02.12.2015 / 23:06

2 respostas

2

Você precisa acompanhar o seu PID, que é colocado em $! para você, apenas para esse propósito. Por exemplo,

#!/usr/bin/bash

(sleep 30; echo "slept for 30 seconds") &
sleeping_pid=$!
# do something
kill $sleeping_pid # or you can wait on it, or...

Observe que $! é o trabalho em segundo plano iniciado mais recentemente. Por isso, tendem a ser sobrescritos, por isso copio imediatamente para uma variável diferente.

    
por 02.12.2015 / 23:50
0

No meu caso particular, consegui atingir meu objetivo alterando a subshell em test.sh para um comando de grupo.

(for i in {1..100}; do echo $i; sleep 1; done) &

tornou-se

{ for i in {1..100}; do echo $i; sleep 1; done; } &

e depois consegui usar todas as funções de controle de trabalho. Felizmente, o subshell e o comando group são basicamente equivalentes para meus propósitos, mas podem não ser para todos.

    
por 03.12.2015 / 16:12