определение того, какой процесс связан с портом

<p>я знаю, что с помощью команды:</p><pre><code>lsof -i tcp </code></pre><p>(или некоторый вариант параметров с lsof) я могу определить, какой процесс связан с конкретным портом. это полезно, если я пытаюсь запустить что-то, что хочет привязать к 8080, а некоторые другие уже используют этот порт, но я не знаю что.</p><p>есть ли простой способ сделать это без использования lsof? я провожу время, работая на многих системах, и lsof часто не устанавливается.</p>

<p><code>netstat -lnp</code> перечислит pid и имя процесса рядом с каждым портом прослушивания. это будет работать в linux, но не во всех других (например, aix.) добавить <code>-t</code> если хотите tcp.</p><pre><code># netstat -lntp active internet connections (only servers) proto recv-q send-q local address foreign address state pid/program name tcp 0 0 0.0.0.0:24800 0.0.0.0:* listen 27899/synergys tcp 0 0 0.0.0.0:8000 0.0.0.0:* listen 3361/python tcp 0 0 127.0.0.1:3306 0.0.0.0:* listen 2264/mysqld tcp 0 0 0.0.0.0:80 0.0.0.0:* listen 22964/apache2 tcp 0 0 192.168.99.1:53 0.0.0.0:* listen 3389/named tcp 0 0 192.168.88.1:53 0.0.0.0:* listen 3389/named </code></pre><p>и т.п.</p>

<p>в aix netstat & rmsock можно использовать для определения привязки процесса:</p><pre><code>[root@aix] netstat -ana|grep listen|grep 80 f100070000280bb0 tcp4 0 0 *.37 *.* listen f1000700025de3b0 tcp 0 0 *.80 *.* listen f1000700002803b0 tcp4 0 0 *.111 *.* listen f1000700021b33b0 tcp4 0 0 127.0.0.1.32780 *.* listen # port 80 maps to f1000700025de3b0 above, so we type: [root@aix] rmsock f1000700025de3b0 tcpcb the socket 0x25de008 is being held by process 499790 (java). </code></pre>

<p>другим инструментом, доступным в linux, является <em>ss</em>. со страницы --- <em>ss</em> на fedora:</p><pre><code>name ss - another utility to investigate sockets synopsis ss [options] [ filter ] description ss is used to dump socket statistics. it allows showing information similar to netstat. it can display more tcp and state informations than other tools. </code></pre><p>пример вывода ниже - последний столбец показывает привязку процесса:</p><pre><code>[root@box] ss -ap state recv-q send-q local address:port peer address:port listen 0 128 :::http :::* users:(("httpd",20891,4),("httpd",20894,4),("httpd",20895,4),("httpd",20896,4) listen 0 128 127.0.0.1:munin *:* users:(("munin-node",1278,5)) listen 0 128 :::ssh :::* users:(("sshd",1175,4)) listen 0 128 *:ssh *:* users:(("sshd",1175,3)) listen 0 10 127.0.0.1:smtp *:* users:(("sendmail",1199,4)) listen 0 128 127.0.0.1:x11-ssh-offset *:* users:(("sshd",25734,8)) listen 0 128 ::1:x11-ssh-offset :::* users:(("sshd",25734,7)) </code></pre>

<p>для solaris вы можете использовать <a href="http://www.unix.com/man-page/all/1/pfiles/">pfiles</a> и затем grep от <code>sockname:</code> или <code>port:</code>.</p><p>образец (от <a href="http://www.linuxquestions.org/questions/solaris-opensolaris-20/netstat-and-pid-598053/">здесь</a> ):</p><pre><code>pfiles `ptree | awk '{print $1}'` | egrep '^[0-9]|port:' </code></pre>

<p>однажды я столкнулся с попыткой определить, какой процесс находится за конкретным портом (на этот раз это было 8000). я пробовал разные lsof и netstat, но затем рискнул и попытался подключиться к порту через браузер (т.е. <a href="http://hostname:8000/">http: // hostname: 8000 /</a> ). и вот, меня приветствовал заставка, и стало очевидно, каков был процесс (для протокола, это было <a href="http://www.splunk.com/">splunk</a> ).</p><p>еще одна мысль: "ps -e -o pid, args" (ymmv) может иногда показывать номер порта в списке аргументов. grep твой друг!</p>