Найти процессы с помощью сетевого интерфейса

9

Я пытаюсь найти способ безопасного отключения сетевого интерфейса, то есть не нарушая никаких процессов. Для этого мне нужно выяснить, какие процессы в данный момент используют этот интерфейс. Такие инструменты , как ss, netstatили lsofполезны показывая , какие процессы имеют открытые сокеты, но они не показывают wpa_supplicant, dhcpcd, hostapdи другие.

Есть ли способ обнаружить эти процессы в целом? Это может быть не для dhcpcd, поскольку это просто программа, открывающая сокет время от времени, но я предполагаю, что wpa_supplicant и hostapd «сделают что-то» с этим интерфейсом, который можно обнаружить и, возможно, также привести к соответствующему PID.

IPSec
источник

Ответы:

13

Такие программы будут использовать сокеты Netlink для прямой связи с драйвером сетевого оборудования. lsofВ версии 4.85 добавлена поддержка сокетов Netlink, но в моем тестировании на CentOS 5.8 эта функция работала не очень хорошо. Возможно, это зависит от возможностей, добавленных в более новые ядра.

Тем не менее, можно сделать довольно хорошее предположение о том, что вы столкнулись с сокетом Netlink. Если вы cat /proc/net/netlinkполучаете список открытых сокетов Netlink, включая PID процессов, у которых они открыты. Затем, если вы lsof -p $THEPIDэти PID, вы найдете записи sockв TYPEстолбце и can't identify protocolв NAMEстолбце. Не гарантируется, что это сокеты Netlink, но это довольно хорошая ставка.

Вы также можете сделать вывод, что данный процесс общается напрямую с интерфейсом, если у него есть /sys/class/net/$IFNAMEоткрытые файлы .

Теперь, после всего сказанного, я думаю, что ваш вопрос ошибочен.

Допустим, есть команда, которую я не обнаружил. Вызовите его lsif -i wlan0и скажите, что он возвращает список идентификаторов PID, обращающихся к названному интерфейсу. Что бы вы могли с ним сделать, что позволит вам «не мешать» процессам, использующим этот интерфейс, как вы и просили? Вы планировали сначала убить все процессы, используя этот интерфейс? Это довольно тревожно. :) Может быть, вы вместо этого подумали, что выпадение интерфейса из-под процесса, использующего его, будет как-то вредно?

Что, в конце концов, так плохо ifconfig wlan0 down?

Сетевые интерфейсы не являются устройствами хранения. Вам не нужно сбрасывать данные на диск и корректно их размонтировать. Не стоит ломать сокеты, но, как вы уже знаете, вы можете понять это с помощью netstatи lsof. wpa_supplicantне будет дуться, если вы отказываетесь от его интерфейса бесцеремонно. (Если это так, это ошибка, и ее нужно исправить; это не будет указывать на какую-то вашу ошибку.)

Хорошо написанные сетевые программы, конечно, справляются с такими вещами. Сети ненадежны. Если программа не может справиться с подпрыгивающим интерфейсом, она также не сможет справиться с отключенными кабелями Ethernet, модемами balky DSL или backhoes .

Уоррен Янг
источник
Большое спасибо. Я обнаружил, что lsof правильно сообщает о сокетах netlink в моей системе. Кажется, достаточно, чтобы ROUTE нашел нужные мне процессы. Для того, что я делаю с этой информацией: спрашиваю пользователя, следует ли отменить выключение в случае, если пользователь запустил процессы, связанные с этим интерфейсом.
IPSec
Есть ли способ узнать, с каким конкретным интерфейсом связаны процессы?
IPSec
Я не знаю способа, если не straceсчитать их, когда они запускаются, и наблюдать за bind(2)звонком.
Уоррен Янг
Вы также можете использовать любые "файлы" tun0 в proc fs, используя эту команду: find /proc/ -name tun0 | cut -d\/ -f3 | uniq | xargs -IPID lsof -p PID
frogstarr78