Eu quero executar dois comandos simultaneamente no bash em uma máquina Linux. Portanto, no meu ./execute.sh
script bash eu coloquei:
command 1 & command 2
echo "done"
No entanto, quando eu quero parar o script bash e pressionar Ctrl+ C, apenas o segundo comando é parado. O primeiro comando continua em execução. Como garantir que o script completo do bash esteja parado? Ou, de qualquer forma, como faço para parar os dois comandos? Porque, neste caso, não importa quantas vezes eu pressione Ctrl+, Co comando continua em execução e sou forçado a fechar o terminal.
Respostas:
Se você digitar
isso é igual a
isto é, ele executará o primeiro comando em segundo plano e, em seguida, executará o segundo comando em primeiro plano. Especialmente, isso significa que você
echo "done"
é impresso após ocommand 2
término, mesmo quecommand 1
ainda esteja em execução.Você provavelmente quer
Isso executará os dois comandos em segundo plano e aguardará a conclusão de ambos.
Se você pressionar CTRL-C, isso enviará apenas o sinal SIGINT para o processo em primeiro plano, ou seja,
command 2
na sua versão ouwait
na minha versão.Eu sugeriria definir uma armadilha como esta:
Com a interceptação, o sinal SIGINT produzido pelo CTRL-C é interceptado e substituído pela
killgroup
função, que mata todos esses processos.fonte
set -x
no início do seu script para imprimir os comandos que são executados.Ao colocar um comando em segundo plano a partir de um script, o PID não é exibido na tela. Você pode usar a variável interna
$!
que armazena o PID do último processo para capturar o PID do comando1.ecoaria o PID do command1.
O Bash também fornece a armadilha integrada que você pode usar para registrar uma sequência de comandos para executar quando sinais específicos são recebidos. Você pode usar isso para capturar o SIGINT e matar o command1 antes de sair do script principal, por exemplo
Agora, enquanto o comando 2 estiver em execução, pressionar Ctrl Cfará com que o comando1 e o comando2 sejam enviados ao SIGINT.
fonte
%n
sintaxe para eliminar trabalhos específicos em segundo plano neste shell. Normalmente, você decidekill %1
matar o último e o único processo em segundo plano. Com mais processos em segundo plano, usejobs
para ver a lista primeiro.As versões mais recentes do GNU Parallel farão o que você deseja:
Ou se
command
permanecer o mesmo:Assista ao vídeo de introdução para uma rápida introdução: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Percorra o tutorial (man paralelo_tutorial). Você comanda a linha com amor por isso.
fonte
Ctrl+ Cenvia um sinal SIGINT para o seu processo frontal, que é
command2
.command1
é executado em segundo plano, portanto, não está preocupado com o fluxo de entrada.Quando você digita
command1 &
, o bash deve fornecer o PID do processo, algo assim[1234]
. Para matar esse processo, você pode usarkill 1234
. Agora, se você tiver os PIDs de amboscommand1
ecommand2
(dê uma olhadaps -ef
), poderá usarkill
para finalizar todos eles:Um pequeno truque seria executar os dois comandos em segundo plano, com:
O Bash oferece dois PIDs, prontos para serem mortos. Outro truque seria trazer de volta
command1
em primeiro plano depois que você matassecommand2
:Mais informações disponíveis aqui: http://linuxg.net/how-to-manage-background-and-foreground-processes/
fonte