Я использую CentOS 7. Я хочу получить PID (если он существует) процесса, работающего на порте 3000. Я хотел бы получить этот PID с целью сохранения его в переменной в сценарии оболочки. Пока у меня есть
[rails@server proddir]$ sudo ss -lptn 'sport = :3000'
State Recv-Q Send-Q Local Address:Port Peer Address:Port
Cannot open netlink socket: Protocol not supported
LISTEN 0 0 *:3000 *:* users:(("ruby",pid=4861,fd=7),("ruby",pid=4857,fd=7),("ruby",pid=4855,fd=7),("ruby",pid=4851,fd=7),("ruby",pid=4843,fd=7))
но я не могу понять, как изолировать PID сам по себе без всей этой дополнительной информации.
linux
shell-script
process
port
Дейв
источник
источник
sudo ss -lptnH "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
, Вам нужно объяснение?ss
без этой опции. Должно работать даже без него:sudo ss -lptn "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
Ответы:
Другое возможное решение:
Например:
источник
TCP:LISTEN
.-s
ключ. Я исправил это в шаблоне. Пример имел этот ключ.Попробуй это:
(требуется
psmisc
пакет)Обратите внимание, что это надежно только при запуске пользователем root. Другой пользователь может только надеяться найти процессы, запущенные с тем же пользователем.
Скучное объяснение только для root-доступа с примером здесь.
Какой бы метод ни использовался (fuser, ss, lsof, ...), все они в конечном итоге сопоставляют доступный список дескрипторов процесса с доступным списком сетевых подключений (например, для tcp, в котором он доступен
/proc/net/tcp
).Например, попытка получить pid с использованием порта
22/tcp
(с 22 = 0x0016) в конечном итоге приведет к такому сравнению:Вход от
/proc/net/tcp
:0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0
с:
dr-x------. 2 root root 0 May 14 17:59 /proc/358/fd lrwx------. 1 root root 64 May 14 17:59 /proc/358/fd/3 -> socket:[141408]
Поскольку этот дескриптор fd доступен только для его пользователя (который в данном примере является пользователем root) или root, только этот пользователь или root может узнать, что pid равен 358.
источник
В то время как
lsof
«s-t
это самый простой способ , чтобы получить PID,lsof
также есть способы , чтобы выбрать другие поля с помощью-F
опции:С выводом вот так (обратите внимание, что PID и файловые дескрипторы всегда печатаются):
Поэтому, если вы хотите использовать идентификатор группы процессов вместо PID, вы можете сделать:
источник
Это то что нужно именно
источник
Предостережение: я могу проверить это только на RedHat.
Должно быть возможно с
netstat
?-n для числовых портов
-l для прослушивающих портов
-p, чтобы увидеть PID
Вы можете использовать ключи --inet или --inet6, чтобы указать, что
netstat
нужно искать только IPv4 или IPv6, иначе вы можете получить два результата.В качестве альтернативы вы можете
awk
распечатать только один разВ
awk
мы просто используем « / » отnetstat
выхода «s ПИД / программы в качестве разделителя.источник