Как узнать, какой узел.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.

удачи!


это сэкономило мне много времени:

pkill node


почему не просто fuser решение?

Если вам все равно, является ли процесс с использованием порта 3000 узлом, это может быть так же просто, как

fuser -k -n tcp 3000

Если вы не хотите быть уверены, что вы не убиваете другие процессы, вы можете пойти с чем-то вроде

PID="$(fuser -n tcp 3000 2>/dev/null)" \
  test "node"="$(ps -p $PID -o comm=)" && kill $PID