GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottengo solo il PID, senza alcuna informazione aggiuntiva, di un processo in esecuzione sulla porta 3000?

Un'altra possibile soluzione:

lsof -t -i :<port> -s <PROTO>:LISTEN

Ad esempio:

# 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

Prova questo:

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

(richiede psmisc pacchetto)

Si noti che questo è affidabile solo quando viene eseguito dall'utente root. Gli altri utenti possono solo sperare di trovare processi in esecuzione con lo stesso utente.

Spiegazione noiosa per l'accesso solo root con un esempio qui.
Qualunque sia il metodo utilizzato (fuser, ss, lsof, ...) finiscono tutti per abbinare l'elenco disponibile di descrittori di processo a un elenco disponibile di connessioni di rete (ad esempio per tcp è disponibile in /proc/net/tcp ).
Ad esempio, cercando di ottenere il pid utilizzando la porta 22/tcp (con 22 =0x0016) finirebbe per fare questo tipo di confronto:

Entrata da /proc/net/tcp :
0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0

insieme a:
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]

Poiché questo descrittore fd è disponibile solo per il suo utente (che in questo esempio è root) o root, solo quell'utente o root può scoprire che il pid è 358.


Mentre lsof è -t è il modo più semplice per ottenere il PID, lsof ha anche modi per selezionare altri campi usando il -F opzione:

$ 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

Con output in questo modo (nota che PID e descrittori di file sono sempre stampati):

$ sudo lsof -F cg -i :22 -s TCP:LISTEN 
p901
g901
csshd
f3
f4

Quindi, se desideri l'ID del gruppo di processi invece del PID, puoi fare:

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

Linux
  1. Linux:come ottenere l'ora dell'orologio da parete di un processo in esecuzione?

  2. Come uccidere un processo in esecuzione su una porta specifica in Linux?

  3. Come visualizzare i processi in esecuzione di qualsiasi utente in SSH?

  4. Come ottengo il percorso di un processo in Unix/Linux

  5. Come uccidere un processo in esecuzione su una particolare porta in Linux?

Come eliminare l'esecuzione del processo Linux su una porta particolare

Come trovare il PID e il PPID di un processo in Linux

Come ottenere solo tutti gli ID di processo in esecuzione?

Come posso ottenere l'ora dell'orologio da parete di un processo in esecuzione?

Come recuperare a livello di codice il GID di un processo in esecuzione

Come ottenere il pid del processo appena avviato