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:
kill -PID
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:
$ ./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 SIGINT
e, 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 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 tentar SIGTERM
( -TERM
) antes de ir para a matança. Nem SIGKILL
ou SIGTERM
pode 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 pgrep
falha.
Sempre use uma linha shebang.
Ctrl + z