Isso mata o processo em segundo plano antes do script sair:
trap '[ "$pid" ] && kill "$pid"' EXIT
function repeat {
while :; do
echo repeating; sleep 1
done
}
repeat &
pid=$!
echo running once
Como funciona
-
trap '[ "$pid" ] && kill "$pid"' EXITIsso cria uma armadilha . Sempre que o script estiver prestes a sair, os comandos entre aspas simples serão executados. Esse comando verifica se a variável% shell
pidfoi atribuída a um valor não vazio. Se tiver, o processo associado apidserá eliminado. -
pid=$!Isso salva o ID do processo do comando antecedente anterior (
repeat &) na variável do shellpid.
Melhoria
Como Patrick aponta nos comentários, há uma chance de que o script possa ser morto após o processo em background começa, mas antes a variável pid é definida. Podemos lidar com esse caso com este código:
my_exit() {
[ "$racing" ] && pid=$!
[ "$pid" ] && kill "$pid"
}
trap my_exit EXIT
function repeat {
while :; do
echo repeating; sleep 1
done
}
racing=Y
repeat &
pid=$!
racing=
echo running once