0

我正在尝试制作一个使用 hostapd 启动/停止访问点的 bash 脚本。

我们有一个极端情况,我们想尽快切换到另一个 wifi 频道,并且由于 hostapd 不支持即时频道交换,我们必须:

  • 杀死进程
  • 更改配置文件
  • 再次启动hostapd。

我决定将信号从主应用程序发送到此脚本(USR1 和 USR2)来执行此操作,但我没有得到预期的结果。我总是首先收到第二个信号,所以它不起作用。我试图在代码中添加一个 sleep(1) 以使其工作,但这不是一个优雅的解决方案。

这是我正在使用的 c++ 行,

killAP();
sleep(1);
generateAP();

这就是脚本。

#!/bin/ash

TASKS=''

enqueueLaunch () {
    TASKS="$TASKS launch"
}

enqueueKill () {
   TASKS="$TASKS kill"
}

launchAP ()  {
    logger -t LAUNCH Launching AP--.
    /scripts/launchAP
    logger -t LAUNCH DONE
}

killAP () {
    logger -t KILL Killing AP

    PID=`cat /var/run/wifi-phy0.pid`
    kill -9 $PID
    iw wlan0 del
    rm -f /var/run/wifi-phy0.pid
    logger -t KILL  DONE
}

parse () {
    for i in $@ ; do
        case "$i" in
            "launch")
                launchAP
                ;;
            "kill")
                killAP
                ;;
        esac
    done
}

echo $$ > /var/run/hostapd-sh.pid

trap enqueueLaunch SIGUSR1
trap enqueueKill SIGUSR2

while :
do                            
   if [ ! -z "$TASKS" ] ; then
      parse $TASKS
      TASKS=""                      
   fi           
   sleep 1      
done

欢迎任何想法。

非常感谢!!

4

1 回答 1

0

虽然保证实时信号按照发送的顺序交付,但标准信号的交付顺序是未指定的。尝试切换到实时信号。


此外,您可能想完全尝试不同的方法。正如其手册页所指定的那样,您可以简单地要求它重新加载其配置文件,而不是杀死然后重新启动hostapd :

可以通过向hostapd 处理器发送SIGHUP或使用hostapd_cli (8)实用程序来重新加载对配置文件的更改,使用hostapd_cli reconfigure.

请注意,已建立的连接会在配置重新加载时丢失。

于 2015-07-17T20:03:13.580 回答