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"' EXIT
Isso 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
pid
foi atribuída a um valor não vazio. Se tiver, o processo associado apid
será 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