GNU/Linux >> Znalost Linux >  >> Linux

Jak získám pouze PID procesu běžícího na portu 3000 bez jakýchkoli dalších informací?

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

Linux
  1. Linux – jak získat čas nástěnných hodin běžícího procesu?

  2. Jak zobrazit běžící procesy libovolného uživatele v SSH?

  3. Jak získám cestu k procesu v Unixu / Linuxu

  1. Jak získat pouze počet řádků souboru

  2. Jak získat PID podle názvu procesu?

  3. Jak dosáhnout toho, aby se pro konkrétní proces spustil pouze uživatel, pid a příkaz? (Ubuntu 11.10)

  1. Jak mohu získat čas nástěnných hodin běžícího procesu?

  2. Jak získat pid procesu a vyvolat na něj kill -9 ve skriptu shellu?

  3. Jak získat PID právě zahájeného procesu