Další možné řešení:
lsof -t -i :<port> -s <PROTO>:LISTEN
Například:
# lsof -i :22 -s TCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1392 root 3u IPv4 19944 0t0 TCP *:ssh (LISTEN)
sshd 1392 root 4u IPv6 19946 0t0 TCP *:ssh (LISTEN)
# lsof -t -i :22 -s TCP:LISTEN
1392
Zkuste toto:
pid=$(fuser 3000/tcp 2>/dev/null)
(vyžaduje psmisc
balíček)
Vezměte prosím na vědomí, že toto je spolehlivé pouze při spuštění uživatelem root. Ostatní uživatelé mohou jen doufat, že najdou procesy běžící se stejným uživatelem.
Nudné vysvětlení pro přístup pouze root s příkladem zde.
Bez ohledu na použitou metodu (fuser, ss, lsof, ...) všechny nakonec odpovídají dostupnému seznamu procesních deskriptorů dostupnému seznamu síťových připojení (např. pro tcp je k dispozici v /proc/net/tcp
).
Například pokus o získání pid pomocí portu 22/tcp
(s 22 =0x0016) by skončilo provedením tohoto druhu srovnání:
Záznam z /proc/net/tcp
:
0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0
s:
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]
Protože tento deskriptor fd je dostupný pouze pro jeho uživatele (kterým je v tomto příkladu shodou okolností root) nebo root, pouze tento uživatel nebo root může zjistit, že pid je 358.
Zatímco lsof
's -t
je nejjednodušší způsob, jak získat PID, lsof
má také způsoby, jak vybrat další pole pomocí -F
možnost:
$ lsof -F'?'
lsof: ID field description
a access: r = read; w = write; u = read/write
c command name
d device character code
D major/minor device number as 0x<hex>
f file descriptor (always selected)
G file flaGs
i inode number
k link count
K task ID (TID)
l lock: r/R = read; w/W = write; u = read/write
L login name
m marker between repeated output
n comment, name, Internet addresses
o file offset as 0t<dec> or 0x<hex>
p process ID (PID)
g process group ID (PGID)
P protocol name
r raw device number as 0x<hex>
R paRent PID
s file size
S stream module and device names
t file type
T TCP/TPI info
u user ID (UID)
0 (zero) use NUL field terminator instead of NL
S podobným výstupem (všimněte si, že PID a deskriptory souborů jsou vždy vytištěny):
$ sudo lsof -F cg -i :22 -s TCP:LISTEN
p901
g901
csshd
f3
f4
Takže pokud byste chtěli ID skupiny procesů místo PID, můžete udělat:
$ sudo lsof -F g -i :22 -s TCP:LISTEN | awk '/^g/{print substr($0, 2)}'
901