Quando executado de forma não interativa (por exemplo, em um script), o bash desabilita o controle de tarefas, de forma que métodos fáceis de eliminar processos em segundo plano, como aqueles em Mate todos os trabalhos em segundo plano ou Como matar todos os empregos no bash? trabalho por padrão.
A primeira coisa que gostaria de fazer é garantir que você esteja executando o bash alterando a linha sh-bang para:
#!/bin/bash
Em seguida, vamos ativar o controle de tarefas (também conhecido como " modo monitor ") para que possamos usar uma das soluções fáceis daquelas perguntas anteriores:
set -m
Em seguida, eu simplificaria a maior parte da sua atividade de subshell; você não precisa deles. Com comandos simplificados, apenas para demonstrar o ponto:
#wait 10 seconds before starting nav and rviz otherwise will get error
sleep 10 || exit
terminator -T "navigation ... bash" &
terminator -T "rviz ... bash" &
...
terminator -T "spawn_objects_launch" &
echo Press any key to to shutdown all processes
read varname
echo Shutting down...
Você não precisa iniciar um subshell inteiro (e criar um plano de fundo) para todos os processos do terminador. Você não precisa executar o sleep 10
em um subshell. Você não realmente precisa testar o código de retorno de sleep 10
para encadear os comandos subsequentes, com &&
. Eu adaptei o código para corresponder ao comportamento existente: se o comando sleep falhar (digamos, você pressionar Control-C), o script sairá e não iniciará os processos subsequentes do terminador.
Por último, adicione o código para eliminar os processos filhos:
...
terminator -T "spawn_objects_launch" &
echo Press ENTER to shutdown all processes
read
echo Shutting down...
kill $(jobs -p)
Reescrevi o aviso; você precisaria digitar (quase) qualquer tecla e então pressionar ENTER para que o comando read
possa ver sua entrada, então eu simplesmente sugiro que o usuário pressione ENTER. Em seguida, o comando read
aceita um nome de variável, mas há uma variável padrão chamada REPLY
que será usada se você não especificar seu próprio nome de variável, portanto, se isso for mais óbvio para você, essa é outra opção simplifique o código.