Encontre processos usando uma interface de rede

9

Estou tentando encontrar uma maneira de desligar com segurança uma interface de rede, ou seja, sem atrapalhar nenhum processo. Para isso, preciso descobrir quais processos estão atualmente usando essa interface. Ferramentas como ss, netstatou lsofestão mostrando útil que os processos têm sockets abertos, mas eles não mostram wpa_supplicant, dhcpcd, hostapde outros.

Existe uma maneira de detectar esses processos de uma maneira geral? Pode não ser o dhcpcd, pois é apenas um programa que abre um soquete de vez em quando, mas estou assumindo que o wpa_supplicant e o hostapd "farão algo" nessa interface que é detectável e talvez também leve ao PID relevante.

ipsec
fonte

Respostas:

13

Esses programas usarão os soquetes Netlink para conversar diretamente com o driver do hardware de rede. lsofA versão 4.85 adicionou suporte para soquetes Netlink, mas nos meus testes no CentOS 5.8, o recurso não parece funcionar muito bem. Talvez isso dependa dos recursos adicionados nos kernels mais recentes.

No entanto, é possível adivinhar quando você encontra um soquete Netlink. Se você cat /proc/net/netlinkreceber uma lista de soquetes Netlink abertos, incluindo o PID dos processos que os abriram. Então, se lsof -p $THEPIDesses PIDs, você encontrará entradas sockna TYPEcoluna e can't identify protocolna NAMEcoluna. Não é garantido que sejam soquetes Netlink, mas é uma aposta muito boa.

Você também pode inferir que um determinado processo está conversando diretamente com uma interface se ela tiver arquivos /sys/class/net/$IFNAMEabertos.

Agora, tudo o que foi dito, acho que sua pergunta está errada.

Digamos que exista um comando que não descobri. Ligue lsif -i wlan0e diga que ele retorna uma lista de PIDs acessando a interface nomeada. O que você poderia fazer com isso que permitiria "não perturbar" os processos usando essa interface, conforme solicitado? Você estava planejando acabar com todos os processos usando essa interface primeiro? Isso é muito perturbador. :) Talvez você estivesse pensando que deixar a interface de baixo de um processo usando-a seria prejudicial?

No final, o que há de tão ruim ifconfig wlan0 down?

As interfaces de rede não são dispositivos de armazenamento. Você não precisa liberar os dados para o disco e desmontá-los normalmente. Não quebrar soquetes abertos pode valer a pena, mas como você já sabe, você pode descobrir isso com netstate lsof. wpa_supplicantnão vai ficar de mau humor se você rejeitar sua interface sem a menor cerimônia. (Caso isso ocorra, é um bug e precisa ser corrigido; não indicaria uma falha sua.)

Programas de rede bem escritos lidam com essas coisas, é claro. Redes não são confiáveis. Se um programa não conseguir lidar com o retorno de uma interface, ele também não conseguirá lidar com cabos Ethernet desconectados, modems DSL desconectados ou retroescavadeiras .

Warren Young
fonte
Muito obrigado. Descobri que o lsof relata corretamente os soquetes netlink no meu sistema. Parece suficiente grep para ROUTE para encontrar os processos que eu quero. Pelo que estou fazendo com essas informações: perguntando ao usuário se o desligamento deve ser cancelado caso o usuário tenha iniciado processos associados a essa interface.
ipsec
Existe uma maneira de descobrir a qual interface específica os processos estão conectados?
Ipsec
Eu não estou ciente de uma maneira, straceexceto quando eles começam, e prestando atenção na bind(2)ligação.
21812 Warren Young
Você também pode usar quaisquer "arquivos" tun0 no proc fs usando este comando: find /proc/ -name tun0 | cut -d\/ -f3 | uniq | xargs -IPID lsof -p PID
frogstarr78