GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya hanya mendapatkan PID, tanpa informasi tambahan, dari proses yang berjalan pada port 3000?

Solusi lain yang mungkin:

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

Misalnya:

# 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

Coba ini:

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

(membutuhkan psmisc paket)

Harap diperhatikan, bahwa ini hanya dapat diandalkan jika dijalankan oleh pengguna root. Pengguna lain hanya dapat berharap menemukan proses yang berjalan dengan pengguna yang sama.

Penjelasan membosankan untuk akses root saja dengan contoh di sini.
Apa pun metode yang digunakan (fuser, ss, lsof, ...) mereka semua pada akhirnya mencocokkan daftar deskriptor proses yang tersedia dengan daftar koneksi jaringan yang tersedia (misalnya untuk tcp tersedia di /proc/net/tcp ).
Misalnya, mencoba mendapatkan pid menggunakan port 22/tcp (dengan 22 =0x0016) pada akhirnya akan melakukan perbandingan seperti ini:

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

dengan:
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]

Karena deskriptor fd ini hanya tersedia untuk penggunanya (yang kebetulan adalah root dalam contoh ini) atau root, hanya pengguna atau root tersebut yang dapat mengetahui bahwa pid adalah 358.


Sedangkan lsof -t adalah cara termudah untuk mendapatkan PID, lsof juga memiliki cara untuk memilih kolom lain menggunakan -F opsi:

$ 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

Dengan keluaran seperti itu (perhatikan bahwa PID dan deskriptor file selalu dicetak):

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

Jadi, jika Anda menginginkan ID grup proses alih-alih PID, Anda dapat melakukan:

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

Linux
  1. Bagaimana Menemukan Id Proses (pid) Dari Program Terminal yang Berjalan?

  2. Bagaimana Cara Membunuh Proses yang Berjalan pada Port Tertentu di Linux?

  3. Bagaimana cara melihat proses yang berjalan dari setiap pengguna di SSH?

  1. Bagaimana cara mematikan proses yang berjalan pada port tertentu di Linux?

  2. Bagaimana cara mendapatkan semua id proses yang sedang berjalan saja?

  3. Cara secara terprogram mengambil GID dari proses yang sedang berjalan

  1. Linux – Bagaimana Mendapatkan Waktu Jam Dinding Dari Proses Yang Berjalan?

  2. Bagaimana Cara Mendapatkan Tty Di Bash Yang Sedang Berjalan?

  3. Bagaimana cara mendapatkan jalur proses di Unix / Linux