0

不确定标题是否正确解释了我的情况,但详细情况如下:

我正在编写一个简单的 bash 脚本来设置无线网络,使用 wlp2s0 接口。

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?也许有人知道为什么会发生这些奇怪的事情。

编辑:如果没有在它之前调用,则ip route add不会给出该错误。killall

4

1 回答 1

1

为什么你觉得很奇怪?成功返回killall并不一定意味着wpa_supplicant已经完成了对传入SIGTERM信号的处理。wpa_supplicant充其量只是将信号传递给进程。也许wpa_supplicant需要更多时间(例如sleep 1)来完成其清理处理程序的执行(wpa_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 回答