it-swarm.com.de

Wie erhalte ich ohne zusätzliche Informationen nur die PID eines Prozesses, der auf Port 3000 ausgeführt wird?

Ich verwende CentOS 7. Ich möchte die PID (falls vorhanden) des auf Port 3000 ausgeführten Prozesses abrufen. Ich möchte diese PID abrufen, um sie in einer Variablen in einem Shell-Skript zu speichern. Bisher habe ich

[[email protected] 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))

aber ich kann nicht herausfinden, wie ich die PID ohne all diese zusätzlichen Informationen alleine isolieren kann.

18
Dave

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
33
Yurij Goncharuk

Versuche dies:

pid=$(fuser 3000/tcp 2>/dev/null)

(erfordert 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 ausgeführt werden.


Langweilige Erklärung für den Root-Zugriff nur mit einem Beispiel hier.
Unabhängig von der verwendeten Methode (Fixiereinheit, ss, lsof, ...) stimmen alle die verfügbare Liste der Prozessdeskriptoren mit einer verfügbaren Liste der Netzwerkverbindungen ab (z. B. für TCP ist sie in /proc/net/tcp).
Wenn Sie beispielsweise versuchen, die PID über Port 22/tcp (Mit 22 = 0x0016) abzurufen, wird dieser Vergleich am Ende durchgeführt:

Eintrag von /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 (in diesem Beispiel root) oder root verfügbar ist, kann nur dieser Benutzer oder root herausfinden, dass die pid 358 lautet.

10
A.B

Während lsof 's -t Der einfachste Weg ist, die PID zu erhalten, hat lsof auch Möglichkeiten, andere Felder mit der Option -F Auszuwählen:

$ 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

Bei 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 wünschen, können Sie Folgendes tun:

$ Sudo lsof -F g -i :22 -s TCP:LISTEN | awk '/^g/{print substr($0, 2)}'
901
4
muru

Genau das brauchen Sie

Sudo lsof -n -i :3000  | awk '/LISTEN/{print $2}'
12726
12730
12732
2
Arushix

Vorsichtsmaßnahme: Ich kann dies nur auf RedHat testen.

Sollte mit netstat möglich sein?

 Sudo netstat -npl --inet | awk '/:3000/' | awk -F "[ /]+" '{print $7}'

- n für numerische Ports
- l für Abhörports
- p um PIDs zu sehen

Sie können die Schalter - inet oder - inet6 verwenden, um netstat, um nur nach IPv4 bzw. IPv6 zu suchen, andernfalls erhalten Sie möglicherweise zwei Ergebnisse.

Alternativ können Sie awk anweisen, nur einmal zu drucken

Sudo netstat -npl | awk '/:3000/' | awk -F "[ /]+" '{print $7; exit}' 

In awk verwenden wir einfach das '/' aus der Ausgabe von netstat von PID/Programm als Trennzeichen.

1
Robert Riedl