У меня есть очень простой скрипт Bash. Цель этого сценария bash - получить параметр номера порта и завершить все процессы, запущенные на этом порту.

#!/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"

Тем не менее, запуск сценария bash в Cygwin правильно отображает PID_NUMBER, но выдает «ERROR: Invalid query» для taskkill

Выход:

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

Если я запускаю «taskkill /F /PID 1540» в Cygwin, процесс успешно завершается.

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

Я запускаю этот скрипт в Windows 10 на терминале Cygwin. Почему мой скрипт выдает ОШИБКУ для taskkill, тогда как просто выполнение taskkill в Cygwin работает?

1 ответ1

0

Вот что сработало для меня:

#!/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"

Примечание 1: мне пришлось заменить -f5 на -f6 потому что в противном случае я бы получил другой столбец.
Примечание 2: taskkill завершится ошибкой с ошибкой: неверный ERROR: Invalid query если было возвращено более одного pid . Решено путем добавления | head -1 .

Вывод 1. Имейте в виду, что ваше решение не является надежным: поскольку netstat может выводить, например, LISTENING до pid вы не можете надежно разделить его так, как делали.
Вывод 2: Вы должны всегда передавать одно значение taskkill , а не многострочную строку.

Предложение. Различайте UDP и TCP , так как TCP соединения имеют столбец STATUS :

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .