Eine andere mögliche Lösung:
lsof -t -i :<port> -s <PROTO>:LISTEN
Zum Beispiel:
# 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
Versuchen Sie Folgendes:
pid=$(fuser 3000/tcp 2>/dev/null)
(benötigt psmisc
Paket)
Bitte beachten Sie, dass dies nur dann zuverlässig ist, wenn es vom Benutzer root ausgeführt wird. Andere Benutzer können nur hoffen, Prozesse zu finden, die mit demselben Benutzer laufen.
Langweilige Erklärung für den Nur-Root-Zugriff mit einem Beispiel hier.
Unabhängig von der verwendeten Methode (fuser, ss, lsof, ...) gleichen sie alle die verfügbare Liste von Prozessdeskriptoren mit einer verfügbaren Liste von Netzwerkverbindungen ab (z. B. für TCP ist sie verfügbar in /proc/net/tcp
). ).
Versuchen Sie beispielsweise, die PID über Port 22/tcp
abzurufen (mit 22 =0x0016) würde am Ende diese Art von Vergleich durchführen:
Eintrag ab /proc/net/tcp
:
0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0
mit:
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]
Da dieser fd-Deskriptor nur für seinen Benutzer (der in diesem Beispiel root ist) oder root verfügbar ist, kann nur dieser Benutzer oder root herausfinden, dass die PID 358 ist.
Während lsof
ist -t
ist der einfachste Weg, um die PID zu erhalten, lsof
hat auch Möglichkeiten, andere Felder mit -F
auszuwählen Möglichkeit:
$ 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
Mit Ausgabe wie folgt (beachten Sie, dass PID und Dateideskriptoren immer gedruckt werden):
$ sudo lsof -F cg -i :22 -s TCP:LISTEN
p901
g901
csshd
f3
f4
Wenn Sie also die Prozessgruppen-ID anstelle der PID haben möchten, können Sie Folgendes tun:
$ sudo lsof -F g -i :22 -s TCP:LISTEN | awk '/^g/{print substr($0, 2)}'
901