Como parar o script de loop bash no terminal?

47

Por exemplo,

#!/bin/bash
while :
do
    sl
done

Como terminar este script bash?

    
por Yinyanghu 17.09.2012 / 17:52

10 respostas

57

O programa sl propositadamente ignora SIGINT , que é o que é enviado quando você pressiona Ctrl + C . Portanto, em primeiro lugar, você precisará informar sl para não ignorar SIGINT adicionando o argumento -e .

Se você tentar isso, notará que pode parar cada indivíduo sl , mas eles ainda se repetem. Você precisa informar bash para sair depois de SIGINT também. Você pode fazer isso colocando um trap "exit" INT antes do loop.

#!/bin/bash
trap "exit" INT
while :
do
    sl -e
done
    
por 17.09.2012 / 18:54
103
  1. pressione Ctrl-Z para suspender o script
  2. kill %%

O %% informa ao bash kill embutido que você deseja enviar um sinal (SIGTERM por padrão) para a tarefa em segundo plano suspensa mais recentemente no shell atual, não para um ID do processo.

Você também pode especificar trabalhos por número ou por nome. por exemplo. quando você suspende um trabalho com ^ Z, o bash lhe diz qual é o número do seu trabalho com algo como [n]+ Stopped , em que n dentro dos colchetes é o número do trabalho.

Para obter mais informações sobre o controle de tarefas e sobre a eliminação de tarefas, execute help jobs , help fg , help bg e help kill no bash e pesquise JOB CONTROL (todas em maiúsculas) ou jobspec na página do homem bash.

por exemplo,

$ ./killme.sh 
./killme.sh: line 4: sl: command not found
./killme.sh: line 4: sl: command not found
./killme.sh: line 4: sl: command not found
./killme.sh: line 4: sl: command not found
./killme.sh: line 4: sl: command not found
...
...
...
./killme.sh: line 4: sl: command not found
^Z
[1]+  Stopped                 ./killme.sh
$ kill %%
$ 
[1]+  Terminated              ./killme.sh

Neste exemplo, o número do trabalho era 1, então kill %1 teria funcionado da mesma forma que kill %%

(Nota: Eu não tenho sl instalado, então a saída é apenas "comando não encontrado". No seu caso, você obterá qualquer saída sl produz. não é importante - o ^Z suspend e kill %% funcionará da mesma forma)

    
por 18.09.2012 / 00:57
2

Você pode finalizar esse script pressionando Ctrl + C no terminal onde você iniciou este script. É claro que este script deve ser executado em primeiro plano para que você possa pará-lo com Ctrl + C.

Ou você pode encontrar o PID (ID do processo) desse script em outro terminal aberto por:

ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>

Ambas as maneiras devem fazer o truque que você está pedindo.

    
por 17.09.2012 / 17:58
2

A maneira mais fácil é emitir o sinal QUIT , que geralmente é anexado a Control-Backslash .

Quando você vê o trem, aperte Control - \

    
por 27.10.2015 / 07:37
2

Se você quiser que ctrl + c pare o loop, mas não termine o script, você pode colocar || break após qualquer comando que esteja executando. Contanto que o programa que você está executando termine em ctrl + c, isso funciona muito bem.

#!/bin/bash
while :
do
    # ctrl+c terminates sl, but not the shell script
    sl -e || break
done

Se você estiver em loop aninhado, você pode usar "break 2" para sair de dois níveis, etc.

    
por 02.12.2015 / 18:43
0

Você pode kill o pid do shell (bash).
Eu apenas tentei e funciona.
Porque não consigo ver o processo de ps -ef (o trabalho que executamos no script de loop).

    
por 26.07.2014 / 16:46
0

Outra forma de finalizar o script inteiro seria fazer o background do comando sl e depois capturar o sinal INT para matar todo o grupo de processos do script com o sinal HUP .

#!/bin/bash

trap 'trap - INT; kill -s HUP -- -$$' INT
#trap 'trap - INT; kill -s HUP 0' INT

while :
do
   sl & wait
done
    
por 22.02.2016 / 17:12
-1

use set -e para sair da falha.

#!/bin/bash
set -e
while :
do
    sl
done
    
por 10.12.2014 / 06:33
-1
while [ true ] 
do

  #check if script is running
  ps | grep script_name.sh | grep -v grep >/dev/null 2>&1

  if [ "$!" != "0" ] ; then
    break
  else

    kill -9 ' ps -ef | grep script_name.sh | cut -d "a" -f 1' 
    echo "kill -9 'get script PID'"

  fi

done

isso deve ajudar.

    
por 08.08.2013 / 14:50
-1

A coisa da matança é horrível, porque você nunca agora, se o roteiro tiver que ser executado duas vezes. E o seu código de saída está errado.

while [ something ]; do

 if [ somethingelse ]; then
   echo shut down script with exit code 0
   exit 0
 fi
done

echo something else not happend
exit 2 # Return val important for example for monitoring

Não funciona. Solução = use perl. enquanto abre própria bash

    
por 28.09.2015 / 12:16