Você tem poucas opções. Uma é parar o script ( CtrlZ), obter o PID do script e enviar SIGKILLpara 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 killcomando, o líder do processo é indicado assim:
kill -PID
Onde PIDestá o ID do processo do script.
Exemplo:
Considere um script test.shque inicia alguns processos. Digamos que você o executou em um shell:
$ ./test.sh
Em outro terminal,
$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)───sshd(1211)───sshd(17312)───sshd(17372)───zsh(17788)───test.sh(17802)─┬─dd(17804)
├─sleep(17805)
└─yes(17803)
Nesse caso, para enviar um sinal ao grupo de processos criado por test.sh, você faria:
kill -INT -17802
-INTé usado para enviar SIGINTe, portanto, este comando é equivalente a pressionar CtrlCo terminal. Para enviar SIGKILL:
kill -KILL -17802
Você só precisa interromper o script se não conseguir abrir outro terminal. Se puder, use pgreppara encontrar o PID.
Um dos comandos que o script inicia pode estar interceptando SIGINT, e é provavelmente por isso que CtrlCé ineficaz. No entanto, SIGKILLnão pode ficar preso, e geralmente é uma opção de último recurso . Você pode tentar SIGTERM( -TERM) antes de ir para a matança. Nem SIGKILLou SIGTERMpode ser configurado como um atalho de teclado da maneira SIGINTé.
Tudo isso é discutível se o seu script não contém uma linha shebang. A partir desta resposta SO :
Normalmente, o shell pai adivinha que o script foi escrito para o mesmo shell (shells mínimos semelhantes a Bourne executam o script com / bin / sh, o bash o executa como um subprocesso do bash) ...
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 pgrepfalha.
Sempre use uma linha shebang.
Ctrl + z