Определить PID процесса прослушивает определенный порт
как говорится в названии, я запускаю несколько игровых серверов, и каждый из них имеет то же самое name
но разные PID
и port
количество. Я хотел бы соответствовать PID
сервера, который слушает на определенном порту, а затем я хотел бы убить этот процесс. Мне это нужно, чтобы завершить мой сценарий bash.
это вообще возможно? Потому что он еще не нашел никаких решений в интернете.
7 ответов:
The
-p
флагnetstat
дает вам PID процесса:netstat -l -p
Edit: команда, которая необходима для получения PIDs пользователей сокетов во FreeBSD-это
sockstat
. Как мы выяснили во время обсуждения с @Cyclone, строка, которая выполняет эту работу:sockstat -4 -l | grep :80 | awk '{print }' | head -1
netstat -p -l | grep $PORT
иlsof -i :$PORT
решения хороши, но я предпочитаюfuser $PORT/tcp
синтаксис расширения для POSIX (который работает дляcoreutils
) как с трубой:pid=`fuser $PORT/tcp`
он печатает чистый pid, так что вы можете упасть
sed
магии.одна вещь, которая делает
fuser
my lover tools-это возможность отправлять сигнал непосредственно этому процессу (этот синтаксис также является расширением POSIX):$ fuser -k $port/tcp # with SIGKILL $ fuser -k -15 $port/tcp # with SIGTERM $ fuser -k -TERM $port/tcp # with SIGTERM
также-k поддерживается FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser
поскольку sockstat не был изначально установлен на моей машине, я взломал ответ stanwise, чтобы использовать netstat вместо этого..
netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print }' | sed -e "s/\/.*//g""
Я хочу программно -- используя только Bash -- убить процесс прослушивания на данном порту.
допустим, порт 8089, то вот как я это сделал:
badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print }' | awk -F/ '{print }' | head -1) kill -9 $badPid
Я надеюсь, что это поможет кому-то еще! Я знаю, что это поможет моей команде.