Eu escrevi um script bash que chama vários outros programas e executa vários comandos. Eu executo esse script no terminal. Agora eu quero matar o script.
Pressionar Ctrl + C
às vezes não ajuda, acho que porque às vezes o script está executando outro programa, e por alguma razão o sinal de interrupção não funciona.
No entanto, se eu fechar a janela do terminal, ele mata o script.
Existe algo que eu possa fazer (uma combinação de teclado), que seja análogo a fechar a janela do terminal, sem realmente fechar a janela do terminal (não quero perder o histórico de comandos, o diretório atual, o histórico de saída etc.)?
Ctrl + z
Ctrl + z
execução:kill -9 $(pgrep -f your_script.sh)
Respostas:
Você tem poucas opções. Uma é parar o script ( CtrlZ), obter o PID do script e enviar
SIGKILL
para o grupo de processos.Quando um comando é executado em um shell, o processo é iniciado e todos os seus filhos fazem parte do mesmo grupo de processos (nesse caso, o grupo de processos em primeiro plano). Para enviar um sinal para todos os processos deste grupo, envie-o ao líder do processo. Para o
kill
comando, o líder do processo é indicado assim:Onde
PID
está o ID do processo do script.Exemplo:
Considere um script
test.sh
que inicia alguns processos. Digamos que você o executou em um shell:Em outro terminal,
Nesse caso, para enviar um sinal ao grupo de processos criado por
test.sh
, você faria:-INT
é usado para enviarSIGINT
e, portanto, este comando é equivalente a pressionar CtrlCo terminal. Para enviarSIGKILL
:Você só precisa interromper o script se não conseguir abrir outro terminal. Se puder, use
pgrep
para encontrar o PID.Um dos comandos que o script inicia pode estar interceptando
SIGINT
, e é provavelmente por isso que CtrlCé ineficaz. No entanto,SIGKILL
não pode ficar preso, e geralmente é uma opção de último recurso . Você pode tentarSIGTERM
(-TERM
) antes de ir para a matança. NemSIGKILL
ouSIGTERM
pode ser configurado como um atalho de teclado da maneiraSIGINT
é.Tudo isso é discutível se o seu script não contém uma linha shebang. A partir desta resposta SO :
Por esse motivo, quando o script é executado, você não encontra um processo com o nome do script (ou um processo com o nome do script na linha de comando) e
pgrep
falha.Sempre use uma linha shebang.
fonte
SIGKILL
ouSIGTERM
?pgrep test.sh
não retorna o PID para mim. Tentei um simples test.sh:for i in {1..30}; do sleep 1 echo $i done
enquantotest.sh
estiver em execução, executopgrep test.sh
em outro terminal, mas nada é retornado. O que há de errado?pgrep -f test.sh
.pgrep -f test.sh
também não funciona. Eu corro o script com./test.sh
Se você conhece os processos associados ao script, pode encontrar seu PID usando
e use o número PID para eliminar os processos correspondentes usando
fonte
Como Harris disse, você pode executar,
Kill -9 PID_Number
mas também pode instalar o pacote conhecido porhtop
ter um navegador de processo interativo que facilita a localização de processos específicos. O htop também suporta processos de morte.fonte