Apa yang menggunakan soket jaringan ini?

18

Saya mencoba menggunakan NTP untuk memperbarui waktu di mesin saya. Namun, itu memberi saya kesalahan:

host # ntpdate ntp1.example.org
10 Aug 12:38:50 ntpdate[7696]: the NTP socket is in use, exiting

Apa artinya kesalahan "soket sedang digunakan"? Bagaimana saya bisa melihat apa yang menggunakan soket ini?

Ini terjadi pada sistem CentOS 4.x saya, tetapi saya juga melihatnya di FreeBSD 7.x, Ubuntu 10.04 dan Solaris 10.

Stefan Lasiewski
sumber
Dalam Stack Overflow: Proses apa yang menggunakan port mana pada unix? (2008-09-24)
Graham Perrin

Jawaban:

20

Anda dapat melakukan

lsof -n | grep -i "TCP\|UDP" | grep -v "ESTABLISHED\|CLOSE_WAIT"

untuk melihat semua porta mendengarkan Anda, tetapi dolar untuk donat yang sedang berjalan ntpd:

service ntpd status

Dan untuk "Apa artinya soket digunakan" artinya? Jika saya dapat dimaafkan untuk merapikan beberapa kerutan (dan untuk penjelasan yang sangat mendasar, permintaan maaf sebagian besar dari ini adalah perbaikan untuk Anda) ... TCP / IP (bahasa internet) menetapkan bahwa setiap komputer memiliki alamat IP, yang secara unik mengidentifikasi komputer itu di internet. Selain itu, ada 65.000 port bernomor pada setiap alamat IP yang dapat dihubungkan.

Ketika Anda ingin terhubung ke server web, Anda membuka situs di browser Anda, tetapi mesin di bawahnya sebenarnya menghubungkan Anda ke port 80 pada IP server web. Daemon server web (program yang mendengarkan koneksi ke port 80) menggunakan "socket" untuk membuka port itu, menyimpannya sendiri. Hanya satu program yang dapat menggunakan port yang sama dalam satu waktu.

Karena Anda menjalankan ntpd, itu menggunakan port itu. 'ntpdate' mencoba mengakses port itu, tetapi karena sudah terbuka, Anda mendapatkan kesalahan 'soket sudah digunakan'.

Sunting
Diubah ke akun untuk UDP juga

Matt Simmons
sumber
1
Ini batu dunia saya! grep pada IPv4 juga untuk menemukan berbagai hal berbasis IP.
geoffc
"permintaan maaf kepada semua orang yang sudah tahu ini" - Jangan minta maaf. Salah satu tujuan dari situs ini adalah untuk memberikan jawaban yang baik untuk pertanyaan umum. Tujuan dari beta awal ini adalah untuk menyediakan konten.
Stefan Lasiewski
Aku tahu, tapi aku ingin memastikan orang yang bertanya itu tahu aku tidak mencoba untuk berbicara dengan mereka.
Matt Simmons
Saya mengajukan pertanyaan, dan Anda tidak meremehkan saya. Saya juga tahu jawabannya, tapi saya pikir itu pertanyaan yang bagus untuk versi beta. Dan jawaban Anda jauh lebih baik daripada apa pun yang akan saya tulis;)
Stefan Lasiewski
@MattSimmons tidak ada Isofperintah di CentOS saya 7.
tiga blok
10

Anda juga dapat menggunakan netstat untuk mencari soket terbuka - jauh lebih bersih daripada menggunakan lsof seperti yang disarankan poster lainnya. Coba baris perintah ini sebagai root

netstat -lp -u -t

untuk melihat semua koneksi mendengarkan, termasuk pid dan program yang terkait. Parameter -l adalah yang menentukan koneksi mendengarkan, -p menentukan bahwa Anda ingin melihat PID / nama dan -t dan -u memberi tahu netstat bahwa Anda hanya menginginkan koneksi TCP dan UDP (IPv4 dan IPv6).

Jika Anda ingin melihat port numerik dan nama host (mis. Tidak diselesaikan dalam kasus host, dan tidak berubah menjadi nama layanan dalam kasus port), Anda dapat menambahkan -nke baris perintah di atas.

EDIT: Ini berfungsi di Linux - Saya tidak tahu seberapa baik kerjanya di BSD, karena saya tidak punya kotak berbasis BSD.

BR
sumber
+1: Ini adalah satu-satunya jawaban yang benar-benar menunjukkan proses ntpd (yang mendengarkan UDP secara default).
Stefan Lasiewski
Untuk manusia: Bendera Anda setara dengannetstat --listen --programs --udp --tcp
Stefan Lasiewski
1
FreeBSD tidak mendukung '-p' ("Show Programs"), itulah sebabnya orang menggunakan LSOF. Itu juga tidak mendukung flag -l ("Show Listening Sockets"), tapi saya pikir Anda bisa melakukannya dengan | grep LISTEN, tetapi itu tidak termasuk koneksi UDP. Tetapi sebaliknya, saya pikir flag yang setara pada FreeBSD adalah:, netstat -p udp -p tcp -atetapi netstat -amungkin lebih sederhana.
Stefan Lasiewski
@Stefan: Jawaban saya akan menunjukkan soket UDP juga.
kbyrd
@kbyrd: Menarik. Itu tidak menunjukkan paket UDP untuk saya. Lihat komentar saya untuk posting Anda.
Stefan Lasiewski
2

Pada FreeBSD, Anda juga dapat menggunakan sockstat jika ia tidak bekerja untuk Anda (misalnya pada sistem tervirtualisasi yang tidak memiliki / dev / mem untuk alasan apa pun). Untuk mendapatkan daftar semua program dengan mendengarkan soket IPv4:

sockstat -l4
diz
sumber
1

Sebagai root, lakukan ini:

lsof | grep IPv4 | grep LISTEN

Ini akan menunjukkan kepada Anda semua proses yang mendengarkan pada soket IPv4. Anda mungkin ingin menambahkan -buntuk mencegah lsofmelakukan beberapa hal yang mungkin memblokirnya. Jika Anda melakukannya Anda mungkin juga ingin mengarahkan stderrke /dev/null.

kbyrd
sumber
Bagi saya, ini sepertinya tidak menunjukkan paket udp. Saya sedang menguji pada kotak Ubuntu yang menjalankan rsyslogd, mendengarkan pada port 514 / udp.
Stefan Lasiewski
Yang perlu saya lakukan sudo lsof |grep UDPuntuk melihat paket UDP.
Stefan Lasiewski
1

Anda dapat menggunakan lsofuntuk menemukan aplikasi mana yang menggunakan soket ini.

txwikinger
sumber
0

Bermain-main dengan three-in-one ini pada OS X 10.9.5:

sudo lsof | grep \ IPv | sort ; clear ; sudo lsof -U ; clear ; sudo netstat -a

Graham Perrin
sumber
0

Dengan FreeBSD gunakan -usakelar sehingga ntpdatemenggunakan port yang tidak diprivasi sebagai gantinya.

Suka: ntpdate -v -b -u 0.freebsd.pool.ntp.org

Gunakan man ntpdateuntuk melihat apa -vdan apa -b.

Monti
sumber
Ntpdate pada Debian memiliki -uopsi, karena ini dari ntp.org, saya kira sebagian besar sistem memilikinya.
RobertL