LINUX.ORG.RU

Узнать pid процесса по номеру занимаемого им порта.

 ,


1

2

Есть задача. Дан номер порта нужно узнать pid процесса который его слушает, или узнать об отсутствие такого процесса. Заранее спасибо.

★★★★★

Последнее исправление: Dudraug (всего исправлений: 1)

Можно пройтись по ветке /proc где для каждого процесса заглядывать в net/tcp, как вариант

obinos
()

lsof, выдаёт имя процесса который слушает порт, можно в исходники глянуть

ilovewindows ★★★★★
()
netstat -lt4p

а вообще 1) посмотри в /proc/net/tcp, 2) узнай номер инода, 3) найди /proc/<pid>/fd/<fd>, ссылающийся на нужный инод (socket:[<inode>]).

нет, проще никак, только netstat :) (который сделает то же самое)

arsi ★★★★★
()
Ответ на: комментарий от Dudraug

Dudraug

Смотрим тэги.

Смотрим в исходники netstat )

AF ★★★
()
Ответ на: комментарий от obinos

Ну а вдруг это очень простая задача для которой есть готовое решение/функция. Кто ж знает, потому и спрашиваю. О исходниках netstat я в курсе, но это вариант на случай если не найду более простых решений.

Dudraug ★★★★★
() автор топика

Есть задача. Дан номер порта нужно узнать pid процесса который его слушает, или узнать об отсутствие такого процесса. Заранее спасибо.

lsof -i

drBatty ★★
()
Ответ на: комментарий от Dudraug

Смотрим тэги.

Учимся пользоваться strace

ttnl ★★★★★
()
Ответ на: комментарий от slackwarrior

Хочешь его в job послать? :)

Зачем куда-то слать, здесь договоримся.

obinos
()

Ладно, буду думать.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

Вообще-то, господин с popen()ом хотел предложить что-то в этом духе. Лучше чем... э... через попен, простите за каламбур, найти будет вам что-то трудно :)

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Хотел предложить ТСу сделать через popen вызов socklist или ,на крайняк, этот socklist посмотреть, все-таки 100 строчек меньше чем 2000 в netstat. Правда перл. Но теперь чё-то очкую, резкий он какой-то. :)

ilovewindows ★★★★★
()
Ответ на: комментарий от slackwarrior

Я наверное на popen и остановлюсь. Просто хотелось что-нибудь побыстрее. Проект ембедед, а срок сдачи проекта - вчера. Времени писать велосипед нет. Так что увы, да, попен.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от anonymous

При том, что мне нужно получить данные сведение в программе на Си++. Я предполагал, что недостаточно внимательно изучил мануалы по работе с сокетами, или что есть какие-нибудь дополнительные решения. Найти такое решение не удалось. Пришлось использовать popen, увы.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от ilovewindows

Он хочет готовую стандартную функцию для этого (наверное, даже сискол) же :3

anonymous
()
Ответ на: комментарий от ilovewindows

Тебе привели решение, тремя постами выше, надо разобрать как работают 30 строчек кода.

Там близко не 30 строчек кода. Намного больше. А все потому что в линаксе нету нормального API для многих вещей.

red_eyed_peguin
()
Ответ на: комментарий от ilovewindows

Уже неважно. Еще раз, я думал, что я тупой и криво прочел маны, потому уточнил. Ну раз нет прямого решения... то дальше я и сам смогу разобраться. Точнее уже разобрался.

Dudraug ★★★★★
() автор топика
Последнее исправление: Dudraug (всего исправлений: 1)
Ответ на: комментарий от red_eyed_peguin

Там близко не 30 строчек кода. Намного больше

ну да, канешное. два цикла с readdir(), по /proc/ и /proc/<pid>/fd и вызов lstat() - это куда больше, чем 30 строк.

ananas ★★★★★
()
Ответ на: комментарий от ananas

Емедед там очень условный. Достаточно мощный арм и более 512мб оперативки. Ip-камера. Но мне эстетически popen самому не нравился. Но проект уже надо было сдавать и в этом не было моей вины. Я не делал оценку этого проекта и не давал сказочных обещаний заказчику. Я лишь оказался в ситуации, когда более чем 100 часовую работу надо сделать за 20 часов.

P.S.:Мне самому не нравится такое решение же, потому и спросил тут емае. Но меня как обычно на лоре полили грязью. Свободное, блин сообщество, которое помогает и решает проблемы вместе... На деле кучка задротов, которые только и ждут, чтобы показать какие они умные и унизить других.

Dudraug ★★★★★
() автор топика
Последнее исправление: Dudraug (всего исправлений: 1)
Ответ на: комментарий от ananas

ну да, канешное. два цикла с readdir(), по /proc/ и /proc/<pid>/fd и вызов lstat() - это куда больше, чем 30 строк.

Ну сами исходники куда более 30 строк. А эти нужные 30 строк еще найти надо было, а времени у меня не было.Посмотрю я на тебя, когда будет работать по 12 часов в сутки, а менеджер будет пресинговать тебя, что мол «давай быстрее, не успеваем! надо сдать проект! работаем лучше! надо успеть! должны сделать!»

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

Ну сами исходники куда более 30 строк. А эти нужные 30 строк еще найти надо было, а времени у меня не было.Посмотрю я на тебя, когда будет работать по 12 часов в сутки, а менеджер будет пресинговать тебя, что мол «давай быстрее, не успеваем! надо сдать проект! работаем лучше! надо успеть! должны сделать!»

не оправдывайся. это пишется за пять минут с нуля.

ananas ★★★★★
()
Ответ на: комментарий от Dudraug

Посмотрю я на тебя, когда будет работать по 12 часов в сутки, а менеджер будет пресинговать тебя, что мол «давай быстрее, не успеваем! надо сдать проект! работаем лучше! надо успеть! должны сделать!»

А кто тебя заставляет в такие проекты впрягаться ? Развернулся и ушел. Если нет - то сам виноват.

ef37 ★★
()
Ответ на: комментарий от ananas

Если знать как. Если бы знал, то я бы не спрашивл. Нэ? Или форум девелопмент нужен только для понтов?

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от ef37

А кто тебя заставляет в такие проекты впрягаться ? Развернулся и ушел. Если нет - то сам виноват.

Наверное то что мне надо на что-то жить.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

первый ответ и немного гуглежки. но ты предпочел ныть здесь, и приспосабливать инвалидную коляску. неудивительно, что ты работаешь по 12 часов в день с постоянными пинками от менеджерья

ananas ★★★★★
()
Ответ на: комментарий от ananas

Толсто же. Я не ныл, а спросил. А мне начали говорить, что это элементарно и вообще я нуб. Лор такой лор.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от ananas

ну да, канешное. два цикла с readdir(), по /proc/ и /proc/<pid>/fd и вызов lstat() - это куда больше, чем 30 строк.

Во-первых, не lstat, а readlink. Чего ты lstat'ом собрался узнать от сокетных дескрипторов? Во-вторых, /proc/net/tcp за тебя дядя Федор парсить будет?

red_eyed_peguin
()

Есть задача. Дан номер порта нужно узнать pid процесса который его слушает, или узнать об отсутствие такого процесса. Заранее спасибо.

Если таки за два дня ты не осилил, то делать тебе надо следующее:

1. Читаем и парсим /proc/net/tcp, чтобы найти inode нужного сокета. Что в этом файле? man 5 proc

2. Обходим все pid-директории в /proc (все директории, в имени которых содержатся только цифры). В каждой такой директории просматриваем каталог fd, с помощью readdir + readlink, обращая внимание на ссылки, имя которых выглядит как socket:[цирфы]. Эти «цифры» и есть искомые inode.

Пример: допустим, мы хотим узнать, слушает ли кто-то на порту 8080.

$ cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 0100007F:1F90 00000000:0000 0A 00000000:00000000 00:00000000 00000000  1000        0 86807 1 db4bcc80 99 0 0 10 -1
   1: E9BFDAC3:A4F3 5AB8645E:03E1 01 00000000:00000000 00:00000000 00000000  1000        0 66492 1 dae93f00 21 3 30 10 -1
   2: E9BFDAC3:8671 8B8F7D4A:0050 01 00000000:00000000 00:00000000 00000000  1000        0 87343 1 dad2c800 21 3 0 10 -1
   3: E9BFDAC3:9251 7D45C2AD:1466 01 00000000:00000000 00:00000000 00000000  1000        0 66428 1 dae91f80 25 3 30 10 -1
   4: E9BFDAC3:9586 ACBC645E:07F9 01 00000000:00000000 00:00000000 00000000  1000        0 67326 1 db830900 20 3 10 10 -1
   5: E9BFDAC3:8919 DD1D0C40:01BB 01 00000000:00000000 00:00000000 00000000  1000        0 67341 1 db830000 36 3 0 10 -1
   6: E9BFDAC3:878A B239584D:1466 01 00000000:00000000 00:00000000 00000000  1000        0 67325 1 db833a80 20 3 30 10 -1
   7: E9BFDAC3:E5E2 761E0C40:01BB 01 00000000:00000000 00:00000000 00000000  1000        0 67337 1 db834c80 35 3 14 7 7
   8: E9BFDAC3:A102 A6490C40:01BB 01 00000000:00000000 00:00000000 00000000  1000        0 65444 1 dad2d100 35 3 4 10 -1
   9: E9BFDAC3:A2E3 863E5DBC:0016 01 00000000:00000000 02:00048AC3 00000000  1000        0 23439 2 dae95100 21 3 1 10 -1
  10: E9BFDAC3:D7AF 5DB8645E:03E1 01 00000000:00000000 00:00000000 00000000  1000        0 66801 1 db837500 21 3 24 10 -1
Состояние «0A» — это LISTEN. Порт и IP указываются в 16-ричном виде. Нам нужно читать этот файл то тех пор, пока не найдем local_address ~ /:1F90/ и st = «0A». После этого запоминаем inode (86807). Затем
for i in /proc/*/fd/*; do [ "`readlink $i`" = "socket:[86807]" ] && echo $i; done
Показывает мне
/proc/8723/fd/6
/proc/8724/fd/6
Итого два процесса (nginx master и worker) слушают на порту 8080.

ВАЖНО: если у тебя в системе куча открытых соединений, обязательно закрывай /proc/net/tcp сразу же после того, как нашел интересующую тебя строку! Большой /proc/net/tcp целиком может читаться десятки секунд, создавая при этом 100% использование одного ядра. А все почему? Потому что в линаксе «заточенный под bash /proc» вместо нормального API.

red_eyed_peguin
()
Ответ на: комментарий от red_eyed_peguin

Во-первых, не lstat, а readlink. Чего ты lstat'ом собрался узнать от сокетных дескрипторов?

ну да, не lstat, a stat. чтобы отсечь несокеты.

Во-вторых, /proc/net/tcp за тебя дядя Федор парсить будет?

а что его парсить-то? fgets()/sscanf()? ну добавь еще пять строк

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.