ネットワークインターフェースを安全にシャットダウンする方法を見つけようとしています。つまり、プロセスを妨害することはありません。そのために、現在そのインターフェイスを使用しているプロセスを見つける必要があります。 ss
、netstat
、lsof
などのツールは、開いているソケットがあるプロセスを示すのに役立ちますが、wpa_supplicant
、dhcpcd
、 hostapd
など。
これらのプロセスを一般的な方法で検出する方法はありますか? dhcpcdは時々ソケットを開くだけのプログラムなので、そうではないかもしれませんが、wpa_supplicantとhostapdがそのインターフェイスに対して「何かを実行」して、検出可能であり、おそらく関連するPIDにもつながると想定しています。
そのようなプログラムは Netlink sockets を使用して、ネットワークハードウェアのドライバーと直接通信します。 lsof
バージョン4.85 追加 Netlinkソケットのサポートですが、CentOS 5.8での私のテストでは、機能がうまく機能していないようです。おそらく、新しいカーネルに追加された機能に依存します。
ただし、いつNetlinkソケットに遭遇したかをかなり推測することは可能です。 cat /proc/net/netlink
を実行すると、開いているNetlinkソケットのリストが、それらを開いているプロセスのPIDを含めて取得されます。次に、これらのPIDをlsof -p $THEPID
すると、sock
列にTYPE
、NAME
列にcan't identify protocol
のエントリが見つかります。これらがNetlinkソケットであることは保証されていませんが、かなり良い方法です。
また、/sys/class/net/$IFNAME
の下に開いているファイルがある場合、特定のプロセスがインターフェースと直接通信していると推測することもできます。
さて、これらのことはすべて言ったので、私はあなたの質問が間違ったものだと思います。
まだ発見していないコマンドがあるとしましょう。それをlsif -i wlan0
と呼び、名前付きインターフェイスにアクセスするPIDのリストを返すと言います。あなたが要求したように、そのインターフェースを使用してプロセスを「邪魔しない」ことを可能にする、それで何ができるでしょうか?最初にそのインターフェースを使用してすべてのプロセスを終了することを計画していましたか?それはかなり不安です。 :)代わりに、インターフェースを使用しているプロセスの下からインターフェースを削除することは、どういうわけか有害であると考えていましたか?
結局、ifconfig wlan0 down
の何が悪いのでしょうか。
ネットワークインターフェイスはストレージデバイスではありません。データをディスクにフラッシュして、正常にアンマウントする必要はありません。開いているソケットを壊さないことは価値があるかもしれませんが、ご存じのとおり、netstat
とlsof
を使用してそれを理解できます。 wpa_supplicant
は、そのインターフェースを無秩序にバウンスしても不自然になりません。 (もしそうなら、それはバグであり、修正する必要があります;それはあなたのいくつかの欠陥を示すものではありません。)
よく書かれたネットワークプログラムは当然のことなどに対応しています。ネットワークは信頼できません。プログラムがバウンスされているインターフェイスに対応できない場合は、プラグが外れているイーサネットケーブル、不安定なDSLモデム、または backhoes にも対応できません。