Как узнать, какой узел.JS pid работает на каком порту
Я хотел бы перезапустить один из многих узлов.JS-процессы, запущенные на моем сервере. Если я побегу ps ax | grep node
Я получаю список всех моих процессов узлов, но он не говорит мне, на каком порту они находятся. Как убить тот, который работает на порту 3000 (например). Каков хороший способ управления несколькими узловыми процессами?
4 ответов
если вы запустите:
$ netstat -anp 2> /dev/null | grep :3000
вы должны увидеть что-то вроде:
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 5902/node
в этом случае 5902
это pid. Вы можете использовать что-то вроде этого, чтобы убить его:
netstat -anp 2> /dev/null | grep :3000 | awk '{ print }' | cut -d'/' -f1 | xargs kill
вот альтернативная версия с использованием egrep
что может быть немного лучше, потому что он ищет специально для строки 'node':
netstat -anp 2> /dev/null | grep :3000 | egrep -o "[0-9]+/node" | cut -d'/' -f1 | xargs kill
вы можете превратить выше в сценарий или поместить следующее в свой ~/.bashrc
:
function smackdown () {
netstat -anp 2> /dev/null |
grep :$@ |
egrep -o "[0-9]+/node" |
cut -d'/' -f1 |
xargs kill;
}
и теперь вы может работать:
$ smackdown 3000
один вкладыш
lsof -n -i:5000 | grep LISTEN | awk '{ print }' | uniq | xargs -r kill -9
вам нужен только sudo, если вы убиваете процесс, который ваш пользователь не запустил. Если ваш пользователь запустил процесс узла, вы, вероятно, можете убить его без sudo.
удачи!
почему не просто fuser
решение?
Если вам все равно, является ли процесс с использованием порта 3000 узлом, это может быть так же просто, как
fuser -k -n tcp 3000
Если вы не хотите быть уверены, что вы не убиваете другие процессы, вы можете пойти с чем-то вроде
PID="$(fuser -n tcp 3000 2>/dev/null)" \
test "node"="$(ps -p $PID -o comm=)" && kill $PID