Temukan proses menggunakan antarmuka jaringan

9

Saya mencoba menemukan cara untuk mematikan antarmuka jaringan dengan aman, yaitu tanpa mengganggu proses apa pun. Untuk ini saya perlu mencari tahu proses apa yang saat ini menggunakan antarmuka itu. Alat seperti ss, netstatatau lsofyang menunjukkan membantu yang proses memiliki soket terbuka, tetapi mereka tidak menunjukkan wpa_supplicant, dhcpcd, hostapddan lain-lain.

Apakah ada cara untuk mendeteksi proses ini secara umum? Mungkin tidak untuk dhcpcd, karena ini hanya sebuah program membuka soket setiap saat, tetapi saya mengasumsikan wpa_supplicant dan hostapd akan “melakukan sesuatu” pada antarmuka yang dapat dideteksi dan mungkin juga mengarah ke PID yang relevan.

ipsec
sumber

Jawaban:

13

Program semacam itu akan menggunakan soket Netlink untuk berbicara dengan driver perangkat keras jaringan secara langsung. lsofversi 4.85 menambahkan dukungan untuk soket Netlink, tetapi dalam pengujian saya pada CentOS 5.8, fitur ini tampaknya tidak berfungsi dengan baik. Mungkin itu tergantung pada fitur yang ditambahkan di kernel yang lebih baru.

Namun, dimungkinkan untuk membuat perkiraan yang cukup baik tentang kapan Anda mengalami soket Netlink. Jika Anda cat /proc/net/netlinkmendapatkan daftar soket Netlink terbuka, termasuk PID proses yang telah dibuka. Kemudian jika Anda lsof -p $THEPIDPID tersebut, Anda akan menemukan entri dengan sockdi TYPEkolom dan can't identify protocoldi NAMEkolom. Ini tidak dijamin bahwa ini adalah soket Netlink, tetapi ini taruhan yang cukup bagus.

Anda juga dapat menyimpulkan bahwa proses yang diberikan berbicara langsung ke antarmuka jika memiliki file di bawah /sys/class/net/$IFNAMEterbuka.

Sekarang, semua yang telah dikatakan, saya pikir pertanyaan Anda salah arah.

Katakanlah ada perintah yang belum saya temukan. Sebut saja lsif -i wlan0, dan katakan itu mengembalikan daftar PID yang mengakses antarmuka yang disebutkan. Apa yang dapat Anda lakukan dengan itu yang memungkinkan Anda untuk "tidak mengganggu" proses menggunakan antarmuka itu, seperti yang Anda minta? Apakah Anda berencana untuk mematikan semua proses menggunakan antarmuka itu terlebih dahulu? Itu cukup mengganggu. :) Mungkin Anda malah berpikir bahwa menjatuhkan antarmuka dari bawah proses menggunakannya entah bagaimana akan berbahaya?

Apa, pada akhirnya, yang sangat buruk ifconfig wlan0 down?

Antarmuka jaringan bukan perangkat penyimpanan. Anda tidak perlu mem-flush data ke disk dan melepasnya dengan anggun. Tidak merusak soket yang terbuka mungkin bermanfaat, tetapi seperti yang sudah Anda ketahui, Anda dapat mengetahuinya dengan netstatdan lsof. wpa_supplicanttidak akan ngambek jika antarmuka terpental begitu saja. (Jika ya, itu adalah bug dan perlu diperbaiki; itu tidak akan menunjukkan kesalahan Anda.)

Program jaringan yang ditulis dengan baik mengatasi hal-hal seperti hal yang biasa. Jaringan tidak bisa diandalkan. Jika suatu program tidak dapat mengatasi antarmuka yang terpental, ia juga tidak akan dapat mengatasi kabel Ethernet yang tidak terhubung, modem DSL yang kasar, atau backhoe .

Warren Young
sumber
Terima kasih banyak. Saya menemukan bahwa lsof dengan benar melaporkan soket netlink di sistem saya. Tampaknya cukup untuk menerima ROUTE untuk menemukan proses yang saya inginkan. Untuk apa yang saya lakukan dengan informasi ini: menanyakan kepada pengguna apakah shutdown harus dibatalkan jika pengguna telah memulai proses yang terkait dengan antarmuka ini.
ipsec
Apakah ada cara untuk mencari tahu ke antarmuka mana proses-proses tersebut terhubung?
ipsec
Saya tidak menyadari cara, kekurangan stracemereka saat mereka mulai, dan mengawasi bind(2)panggilan.
Warren Young
Anda juga dapat menggunakan "file" tun0 dalam proc fs menggunakan perintah ini: find /proc/ -name tun0 | cut -d\/ -f3 | uniq | xargs -IPID lsof -p PID
frogstarr78