GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erhalte ich nur die PID ohne zusätzliche Informationen eines Prozesses, der auf Port 3000 läuft?

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

Linux
  1. Linux – Wie erhalte ich die Uhrzeit eines laufenden Prozesses?

  2. Wie finde ich die Prozess-ID (PID) eines laufenden Terminalprogramms?

  3. Wie beendet man einen Prozess, der auf einem bestimmten Port in Linux läuft?

  4. Wie kann ich die laufenden Prozesse eines beliebigen Benutzers in SSH anzeigen?

  5. Wie erhalte ich den Pfad eines Prozesses in Unix / Linux

So beenden Sie den laufenden Linux-Prozess auf einem bestimmten Port

So finden Sie die PID und PPID eines Prozesses in Linux

Wie bekomme ich nur den Benutzer, die PID und den Befehl, der für einen bestimmten Prozess ausgeführt wird? (Ubuntu 11.10)

Wie kann ich die Uhrzeit eines laufenden Prozesses abrufen?

Wie erhalte ich die PID eines Prozesses und rufe im Shell-Skript kill -9 darauf auf?

Wie man einen gerade gestarteten Prozess pipi bekommt