【发布时间】:2015-07-16 16:40:35
【问题描述】:
我正在尝试制作一个使用 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
欢迎任何想法。
非常感谢!!
【问题讨论】:
-
为什么这个脚本运行在后台监听信号而不是在需要的时候被调用?
-
我们在应用程序中使用 fastCGI,如果我们在打开 fascgi 套接字后停止并启动 hostapd,hostapd 会保持打开状态,当我再次尝试绑定它们时,它会获取那些产生问题的套接字。
-
虽然实时信号保证按照发送的顺序发送,但标准信号的发送顺序是未指定的。尝试切换到实时信号。
-
@Acampoh,你试过切换到实时信号吗?
标签: linux bash signals hostapd bash-trap