我正在尝试找到一种安全关闭网络接口的方法,即不干扰任何进程。为此,我需要找出当前有哪些进程正在使用该接口。ss
、netstat
或等工具lsof
有助于显示哪些进程具有打开的套接字,但它们不显示wpa_supplicant
、dhcpcd
和hostapd
其他工具。
有没有一种方法可以通用地检测这些过程?它可能不适用于 dhcpcd,因为它只是一个时不时打开套接字的程序,但我假设 wpa_supplicant 和 hostapd 会对该接口“做一些事情”,该接口是可检测的,并且可能还会导致相关的 PID。
答案1
此类程序将使用网络链接套接字直接与网络硬件的驱动程序对话。lsof
4.85版本添加支持 Netlink 套接字,但在我在 CentOS 5.8 上的测试中,该功能似乎运行得不太好。也许这取决于新内核中添加的功能。
然而,当您遇到 Netlink 套接字时,可以做出很好的猜测。如果您cat /proc/net/netlink
获得打开的 Netlink 套接字列表,包括打开它们的进程的 PID。然后,如果您使用这些 PID,您将在列 和列中lsof -p $THEPID
找到 的条目。虽然不能保证这些是 Netlink 套接字,但这是一个不错的选择。sock
TYPE
can't identify protocol
NAME
您还可以推断,如果给定进程有打开的文件,则该进程正在直接与接口对话/sys/class/net/$IFNAME
。
话虽如此,我认为你的问题是错误的。
假设有一个我还没有发现的命令。调用它lsif -i wlan0
,并说它返回访问指定接口的 PID 列表。您可以用它做什么来让您按照您的要求“不干扰”使用该界面的进程?您是否打算首先终止使用该界面的所有进程?这真是令人不安。 :) 也许您认为将接口从使用它的进程下面删除会以某种方式有害?
到底是什么这么糟糕ifconfig wlan0 down
?
网络接口不是存储设备。您不必将数据刷新到磁盘并优雅地卸载它们。不破坏打开的套接字可能是值得的,但正如您所知,您可以使用netstat
和来解决这个问题lsof
。wpa_supplicant
如果你毫不客气地弹回它的界面,它不会生闷气。 (如果确实如此,则这是一个错误,需要修复;这并不表明您有任何错误。)
编写良好的网络程序可以理所当然地处理这些事情。网络不可靠。如果程序无法处理被退回的接口,它也无法处理未插入的以太网电缆、不稳定的 DSL 调制解调器或反铲。