Saya menggunakan CentOS 7. Saya ingin mendapatkan PID (jika ada) dari proses yang berjalan pada port 3000. Saya ingin mendapatkan PID ini untuk keperluan menyimpannya ke variabel dalam skrip shell. Sejauh ini saya punya
[rails@server 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))
tapi saya tidak tahu bagaimana mengisolasi PID dengan sendirinya tanpa semua informasi tambahan ini.
linux
shell-script
process
port
Dave
sumber
sumber
sudo ss -lptnH "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
. Apakah Anda perlu penjelasan?ss
tanpa opsi ini. Harus bekerja bahkan tanpa itu:sudo ss -lptn "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
Jawaban:
Solusi lain yang mungkin:
Sebagai contoh:
sumber
TCP:LISTEN
.-s
kunci. Saya sudah memperbaikinya dalam pola. Contoh punya kunci ini.Coba ini:
(membutuhkan
psmisc
paket)Harap dicatat, bahwa ini hanya dapat diandalkan ketika dijalankan oleh root pengguna. Pengguna lain hanya bisa berharap menemukan proses yang berjalan dengan pengguna yang sama.
Penjelasan membosankan untuk akses hanya root dengan contoh di sini.
Apa pun metode yang digunakan (fuser, ss, lsof, ...) mereka semua akhirnya cocok dengan daftar deskriptor proses yang tersedia dengan daftar koneksi jaringan yang tersedia (misalnya untuk tcp tersedia di
/proc/net/tcp
).Misalnya, mencoba untuk mendapatkan pid menggunakan port
22/tcp
(dengan 22 = 0x0016) akan berakhir dengan melakukan perbandingan seperti ini:Entri 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 menjadi root dalam contoh ini) atau root, hanya pengguna atau root yang dapat mengetahui pid adalah 358.
sumber
Sementara
lsof
itu-t
adalah cara paling sederhana untuk mendapatkan PID,lsof
juga memiliki cara untuk memilih bidang lain menggunakan-F
opsi:Dengan output seperti itu (perhatikan bahwa PID dan deskriptor file selalu dicetak):
Jadi, jika Anda menginginkan ID grup proses alih-alih PID, Anda bisa melakukan:
sumber
Inilah yang sebenarnya Anda butuhkan
sumber
Peringatan: Saya hanya bisa menguji ini di RedHat.
Haruskah mungkin dengan
netstat
?-n untuk port numerik
-l untuk mendengarkan port
-p untuk melihat PID
Anda dapat menggunakan sakelar --inet atau --inet6 untuk memberi tahu
netstat
masing-masing hanya mencari IPv4 atau IPv6, jika tidak, Anda mungkin mendapatkan dua hasil.Atau Anda dapat meminta
awk
untuk mencetak hanya sekaliDalam
awk
kita hanya menggunakan ' / ' darinetstat
'output PID / program sebagai pemisah.sumber