Кто занял сокет?

Кто занял сокет?

Гм… Одной самописной утилите не удается запуститься, причина — занят сокет! Да еще как занят:

sam@server-na-debiane:~$ sudo netstat -anp | grep 3080
tcp        0      0 127.0.0.1:3080          0.0.0.0:*               LISTEN      -

Непонятно, кем и зачем. Что же будем искать? На самом деле, не в первый раз встречаемся с такой ситуацией.  Трудно сказать, кто виноват в том, что не так просто найти занятый сокет, и стандартные инструменты тут не помогают.  Кроме netstat, нам могут помочь  lsof, fuser. Но на данном сервере они нам не помогут:

[18260981.182688] INFO: task lsof:30065 blocked for more than 120 seconds.
[18260981.182688] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[18260981.182688] lsof          D 0000000000000000     0 30065  23091
[18260981.182688]  ffff810be594db28 0000000000000082 0000000000000000 ffffffff802d6a00
[18260981.182688]  ffff810c1b0523c0 ffff81063ccba080 ffff810c1b052648 0000000100000001
[18260981.182688]  3061326164633430 0000000000000000 00000000ffffffff 0000000000000000
[18260981.182688] Call Trace:
[18260981.182688]  [<ffffffff802d6a00>] pid_revalidate+0x5a/0xe7
[18260981.182688]  [<ffffffffa03283be>] :sunrpc:rpc_wait_bit_killable+0x0/0x31
[18260981.182688]  [<ffffffffa03283e8>] :sunrpc:rpc_wait_bit_killable+0x2a/0x31
[18260981.182688]  [<ffffffff804296e2>] __wait_on_bit+0x40/0x6e
[18260981.182688]  [<ffffffffa03283be>] :sunrpc:rpc_wait_bit_killable+0x0/0x31
[18260981.182688]  [<ffffffff8042977c>] out_of_line_wait_on_bit+0x6c/0x78
[18260981.182688]  [<ffffffff802461d3>] wake_bit_function+0x0/0x23
[18260981.182688]  [<ffffffffa0324cff>] :sunrpc:xprt_reserve+0x14b/0x15a
[18260981.182688]  [<ffffffffa0328983>] :sunrpc:__rpc_execute+0xe6/0x223
[18260981.182688]  [<ffffffffa0322bcb>] :sunrpc:rpc_run_task+0x4f/0x56
[18260981.182688]  [<ffffffffa0322c67>] :sunrpc:rpc_call_sync+0x3e/0x5b
[18260981.182688]  [<ffffffff80238b75>] current_fs_time+0x1e/0x24
[18260981.182688]  [<ffffffffa037f11a>] :nfs:_nfs4_proc_getattr+0x6c/0x71
[18260981.182688]  [<ffffffffa0380209>] :nfs:nfs4_proc_getattr+0x29/0x45
[18260981.182688]  [<ffffffffa036fe7d>] :nfs:__nfs_revalidate_inode+0xfe/0x236
[18260981.182688]  [<ffffffff8027cc6d>] zone_statistics+0x3a/0x8e
[18260981.182688]  [<ffffffff802afc1d>] mntput_no_expire+0x20/0x117
[18260981.182688]  [<ffffffff802a46b6>] path_walk+0x7e/0x8b
[18260981.182688]  [<ffffffffa03706e5>] :nfs:nfs_getattr+0xac/0xd7
[18260981.182688]  [<ffffffff8029e3fc>] vfs_stat_fd+0x32/0x4a
[18260981.182688]  [<ffffffff802afc1d>] mntput_no_expire+0x20/0x117
[18260981.182688]  [<ffffffff8029dfe7>] sys_readlinkat+0x89/0x9a
[18260981.182688]  [<ffffffff8029e470>] sys_newstat+0x19/0x31
[18260981.182688]  [<ffffffff8031e30f>] __up_write+0x21/0x10e
[18260981.182688]  [<ffffffff80284985>] sys_munmap+0x4d/0x5a
[18260981.182688]  [<ffffffff8020beda>] system_call_after_swapgs+0x8a/0x8f

Упавший модуль не дает системе нормально работать… Тогда будем искать вручную! Есть такой файл — /proc/net/tcp, там указаны все текущие соединения. Точнее, это не совсем файл, и не совсем папка — файловая система procfs. Правда, в 16-ричной системе измерения. Наш 127.0.0.1:3080 в HEX это 0100007F:0C08 (посчитан в обычном виндовском калькуляторе). Ищем его:

sam@server-na-debiane:~$ sudo grep "0100007F\:0C08" /proc/net/tcp
  16: 0100007F:0C08 00000000:0000 0A 00000000:00000000 00:00000000 00000000  1001        0 3774465748 1 ffff810a19154b40 300 0 0 2 -

Вот он, занятый сокет. В данной строке нас интересует его inode. Если верить столбцу, здесь он равен — 3774465748.

Теперь ищем pid:

sam@server-na-debiane:~$ sudo find /proc -wholename '*/fd/*' -ls |grep 3774465748
find: `/proc/2603/fd/73': Нет такого файла или каталога
find: `/proc/9499/task/9499/fd/267': Нет такого файла или каталога
find: `/proc/9499/task/9499/fd/272': Нет такого файла или каталога
2599520825    0 lrwx------   1 user     user           64 Май 29 18:25 /proc/9968/task/9968/fd/16 -> socket:[3774465748]
2599577467    0 lrwx------   1 user     user           64 Май 29 18:25 /proc/9968/task/9985/fd/16 -> socket:[3774465748]
find: `/proc/9968/task/9985/fd/14367': Нет такого файла или каталога
find: `/proc/9968/task/9985/fd/18484': Нет такого файла или каталога
find: `/proc/9968/task/9985/fd/25297': Нет такого файла или каталога
find: `/proc/9968/task/9985/fd/25389': Нет такого файла или каталога
2599634324    0 lrwx------   1 user     user           64 Май 29 18:25 /proc/9968/task/9986/fd/16 -> socket:[3774465748]
find: `/proc/9968/task/9986/fd/4651': Нет такого файла или каталога
2599691146    0 lrwx------   1 user     user           64 Май 29 18:25 /proc/9968/task/9987/fd/16 -> socket:[3774465748]
find: `/proc/9968/task/9987/fd/18220': Нет такого файла или каталога
2599747790    0 lrwx------   1 user     user           64 Май 29 18:25 /proc/9968/task/9988/fd/16 -> socket:[3774465748]
...

Дальше можно не искать, pid уже виден. Смотрим, что это:

sam@server-na-debiane:~$ sudo ps aux| grep 9968
user      9968  7.7  4.1 2649300 2074656 ?     Sl   Apr24 3880:31 ./<application_name>
sam      30067  0.0  0.0   8620   880 pts/19   S+   18:26   0:00 grep 9968

Вот и виновник:)