У меня странная ситуация с открытым сетевым портом. Мой главный вопрос: почему бы не было программы, связанной с открытым TCP-портом:
netstat -ln --program
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:5666 0.0.0.0:* LISTEN -
В моем конкретном случае предполагается, что демон nrpe (установка opsview) прослушивает порт 5666, но демон nrpe не запущен. Если я попытаюсь запустить его, он немедленно завершится.
lsof -i :5666
тоже не показывает никаких выходных данных. В моей системе нет (x) inetd.
ОБНОВИТЬ
Да, я запускал эти команды как root. Telnet мог бы, но ответа не последовало.
После дальнейшего расследования я обнаружил ошибку ядра в dmesg
: это был экземпляр EC2 (на самом деле их несколько) с более старым ядром (версия 2.6.16 явно нестабильна). Исправление, чтобы остановить сбой, заключалось в обновить ядра.
Похоже, что сбой ядра заставил процесс уйти и оставить порт открытым.
Вы запускали netstat и lsof от имени пользователя root или с помощью sudo? Обратите внимание на последний столбец:
netstat -ln --program
tcp 0 0 192.168.21.1:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
sudo netstat -ln --program
tcp 0 0 192.168.21.1:53 0.0.0.0:* LISTEN 2566/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 2566/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3125/sshd
Из справочной страницы netstat:
Вам также потребуются права суперпользователя, чтобы просматривать эту информацию о сокетах, которыми вы не владеете.
Откуда вы знаете, что никто не работает? Если порт уже используется, имеет смысл немедленно выйти из него с ошибкой «используется сокет». что происходит, когда вы подключаетесь телнетом к порту?
telnet localhost 5666
Порты, открытые ядром, не отображаются с именем программы. На ум приходят некоторые вещи, связанные с NFS и OCFS. Может это как то?
Или это может быть ошибка ядра. Проверьте журналы ядра на наличие OOPS и BUG.
выполнить 'netstat --tcp --udp --listening --program' как пользователь root. в противном случае вам это не даст PID / Название программы
затем используйте команду kill -9 PID
Я смог отследить процесс, получив его индекс через netstat, а затем используя этот индекс с помощью lsof. Смотрите мой более подробный ответ в https://serverfault.com/a/847910/94376.
Я на самом деле написал небольшой сценарий оболочки, чтобы помочь, если возникают эти случайные вопросы:
#! /bin/bash
([ "$1" = "" ] || [ "$2" = "" ]) && echo "Usage: tracer <space> <port>" && exit 0
for i in `fuser -n $1 $2`
do
ps aux | grep $i | grep -v 'grep'
done
сохранить как / usr / local / bin / tracer; вывод:
root@mo-log:/usr/flows# tracer tcp 80
80/tcp:
root 27904 0.0 0.0 111668 3292 ? Ss Aug04 0:03 /usr/sbin/apache2 -k start
www-data 32324 0.0 0.0 335332 3560 ? Sl Aug05 0:00 /usr/sbin/apache2 -k start
www-data 32327 0.0 0.0 335324 3560 ? Sl Aug05 0:00 /usr/sbin/apache2 -k start
Для его использования вам потребуются права root
Иногда программы, относящиеся к nfs, не отображаются в списке программ.
Кроме того, модули pam LDAP и libnss_ldap открывают соединения с серверами ldap, но нет фактического процесса, удерживающего соединение открытым, поэтому netstat -tnp показывает активное соединение без процесса.