OpenWrt的mjpg-streamer软件包安装后会在/etc/hotplug.d/usb/下生成”20-mjpg-streamer“shell脚本文件(对应在OpenWrt源码位置:feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.hotplug)。此文件源码如下:
case "$ACTION" in
add)
# start process
/etc/init.d/mjpg-streamer start
;;
remove)
# stop process
/etc/init.d/mjpg-streamer stop
;;
esac
其功能是在插入usb设备时,会执行此脚本add分支下的代码,这里即执行/etc/init.d/mjpg-streamer start。当usb设备移除时会执行此脚本的remove分支代码,这里即执行/etc/init.d/mjpg-streamer stop。如果路由只有一个usb口并且没有外接usb hub时,此脚本可以工作的很好(唯一问题是不管插入何种usb设备都会运行此脚本的add分支,移除时会执行此脚本的remove分支)。但是在多usb口或者外接了usb hub后,如果挂载的usb摄像头mjpg-streamer服务已经良好的运行,此时再移除usb hub下的其他usb设备会导致mjpg-streamer服务被停止,不够智能,我们需要让它更智能些。
解决办法是add和remove分支都加入判断条件。mjpg-streamer服务需要运行的条件是”/dev/video*“文件存在并且存在”/usr/bin/mjpg_streamer“可执行文件且”mjpg-streamer“服务还未运行。mjpg-streamer服务需要停止的条件是”/dev/video*“文件不存在并且”mjpg-streamer“服务还在运行。综上所述,修改此脚本代码如下:
case "$ACTION" in
add)
if [ -c /dev/video[0-9] ] &&
!(pgrep -f mjpg_streamer >/dev/null 2>&1) &&
[ -x "/usr/bin/mjpg_streamer" ]; then
/etc/init.d/mjpg-streamer start
fi
;;
remove)
if [ ! -c /dev/video[0-9] ] &&
(pgrep -f mjpg_streamer >/dev/null 2>&1); then
/etc/init.d/mjpg-streamer stop
fi
;;
esac