0

タイトルが私の状況を正しく説明しているかどうかはわかりませんが、詳細は次のようになります。

wlp2s0 インターフェイスを使用して、ワイヤレス ネットワークをセットアップするための簡単な bash スクリプトを作成しています。

ip route flush dev wlp2s0
ip addr flush dev wlp2s0
ip link set wlp2s0 down

killall wpa_supplicant

ip link set wlp2s0 up
ip addr add 192.168.1.200/24 dev wlp2s0
ip route add default via 192.168.1.1

wpa_supplicant -B -D wext -i wlp2s0 -c wireless.conf

以前に開始されたすべての wpa_supplicants を強制終了してから、新しいものを開始します。さて、問題は、killall呼び出しがip route add泣くことです:

RTNETLINK の回答: ネットワークに到達できません

wpa_supplicant が実際に以前に開始されたかどうかは関係ありません。

sleep 1の後に呼び出しを追加することで「修正」できますkillallが、もちろんこれは避けたいと思います。killallコマンドを削除し、スクリプトの前に手動で呼び出すことで修正することもできます。

問題は、のこの奇妙な動作を回避するにはどうすればよいかということkillallです。なぜこれらの奇妙なことが起こっているのか、誰かが何か知っているかもしれません。

EDIT:前に呼び出されていないip route add場合、そのエラーは発生しません。killall

4

1 に答える 1

1

なんで変だと思ったの?が正常に返されたからといって、着信信号の処理が完了したとkillallは限りません。せいぜい、シグナルがプロセスに配信されただけです。クリーンアップ ハンドラ (内)の実行が完了するまでに、もう少し時間が必要だった可能性があります ( など)。wpa_supplicantSIGTERMwpa_supplicantwpa_supplicantsleep 1wpa_supplicant_terminate_proc()wpa_supplicant.c

だから、私はあなたが本当に必要だと思いますsleep 1.

アップデート

私はいつもこのようなポーリング方法に頼っています

TIMEO=5
for ((i=0; i<TIMEO; ++i)); do
    if pidof -s wpa_supplicant > /dev/null; then
        sleep 1
    else
        break
    fi
done

if ((TIMEO==i)); then
    echo "timeout"
else
    echo "it's gone"
fi

のインスタンスが複数存在しないと仮定しますwpa_supplicant

于 2014-04-21T17:40:05.130 に答える