Shell script, чтобы убить процесс, прослушивающий порт 3000?

Я хочу определить псевдоним bash с именем kill3000 для автоматизации следующей задачи:

$ lsof -i:3000

COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
ruby    13402 zero    4u  IPv4 2847851      0t0  TCP *:3000 (LISTEN)

$ kill -9 13402

Ответ 1

alias kill3000="fuser -k -n tcp 3000"

Ответ 2

Попробуйте следующее:

    kill -9 $(lsof -i:3000 -t)

Флаг -t - это то, что вы хотите: оно отображает PID и ничего больше.

UPDATE

Если процесс не найден, и вы не хотите видеть сообщение об ошибке:

    kill -9 $(lsof -i:3000 -t) 2> /dev/null

Предполагая, что вы используете bash.

UPDATE

Предложение Basile превосходно: сначала нужно попытаться завершить процесс, как правило, будет убивать -TERM, если это не удастся, тогда kill -KILL (AKA kill -9):

    pid=$(lsof -i:3000 -t); kill -TERM $pid || kill -KILL $pid

Возможно, вы захотите сделать это bash.

Ответ 3

Другой вариант, используя исходную команду lsof:

lsof -n -i:3000 | grep LISTEN | awk '{ print $2 }' | uniq | xargs kill -9

Если вы хотите использовать это в оболочке script, вы можете добавить флаг -r в xargs, чтобы обрабатывать случай, когда процесс не прослушивается:

... | xargs -r kill -9

Ответ 4

fuser -n tcp 3000

Выдает вывод

3000/tcp:     <$pid>

Итак, вы можете сделать:

fuser -n tcp 3000 | awk '{ print $2 }' | xargs -r kill

Ответ 5

Как насчет

alias kill3000="lsof -i:3000 | grep LISTEN | awk '{print $2}' | xargs kill -9"

Ответ 6

fuser -k 3000/tcp также должен работать