Não é possível executar o "taskkill" em um script bash, mas pode ser executado a partir do cygwin

0

Eu tenho um script Bash muito simples. O objetivo deste script bash é pegar um parâmetro de um número de porta e matar todos os processos em execução nessa porta.

#!/bin/bash
PID_NUMBER=$(netstat -a -n -b -o | grep $1 | sed -e "s/[[:space:]]\+/ /g" | cut -d ' ' -f5)
echo "$PID_NUMBER"
taskkill /F /PID "$PID_NUMBER"

No entanto, a execução do script bash no Cygwin ecoa o PID_NUMBER corretamente, mas lança uma "ERROR: consulta inválida" para taskkill

Saída:

$ ./KillProcessesAtPort.sh 546
1540
ERROR: Invalid query

Se eu executar "taskkill / F / PID 1540" no Cygwin, o processo será encerrado com êxito.

$ taskkill /F /PID 1540
SUCCESS: The process with PID 1540 has been terminated.

Estou executando este script no Windows 10 no terminal Cygwin. Por que meu script lança um erro para o taskkill, enquanto que apenas a execução de um taskkill no Cygwin funciona?

    
por Mantracker 07.08.2017 / 20:54

1 resposta

0

Veja o que funcionou para mim:

#!/bin/bash
PID_NUMBER=$(netstat -a -n -b -o | grep $1 | sed -e "s/[[:space:]]\+/ /g" | cut -d ' ' -f6 | head -1)
echo "$PID_NUMBER"
taskkill /F /PID "$PID_NUMBER"

Observação1: precisei substituir -f5 por -f6 porque, do contrário, eu obteria uma coluna diferente.
Observação2: taskkill falharia com ERROR: Invalid query quando mais de um pid foi retornado. Resolvido adicionando | head -1 .

Conclusão1: tenha em atenção que a sua solução não é robusta: uma vez que netstat pode produzir, p. ex. LISTENING antes do pid você não pode dividir confiavelmente como você fez.
Conclusão2: Você deve sempre passar um único valor para taskkill , não uma string multilinha.

Sugestão: diferencie por UDP e TCP , pois TCP conexões têm uma coluna STATUS :

PID_NUMBER=$(netstat -a -n -o | grep :$1 | awk '/UDP/{a=$4} /TCP/{a=$5} END{print a}')
    
por 09.08.2017 / 19:03