我需要运行一个脚本,当调制解调器管理器检测到调制解调器时(即mmcli -L
列出调制解调器)创建一个连接。我目前已设置了一条 udev 规则来执行此操作,但mmcli
注册调制解调器花费的时间太长,以至于脚本已经运行完毕。
我希望有办法做以下事情之一:
- 延迟从 udev 启动脚本
- 允许脚本在后台运行或进入睡眠状态直到
mmcli
看到调制解调器(我一直试图让它工作,但是对该sleep
函数的调用被跳过,并且它不允许我在不同的线程中运行) mmcli
识别调制解调器时自动运行脚本
这是我最近尝试的片段:
sleep 10
count=0
while [ count < 300 ]
do
index=$(mmcli -L | grep Modem | head -n1 | awk '{print $1;}')
let "count+=1"
done
port=$(mmcli -m $index | grep 'primary port' | grep -oP 'ttyACM[0-9]')
connection=$(nmcli c show | grep "modem${port: -1}")
# check if connection does not exist
if [ ! $connection ]; then
echo 'adding new connection at ' date >> /home/nvidia/runlog.txt
nmcli c add type gsm ifname "${port}" con-name "modem${port: -1}" apn testers.apn.com
fi
nmcli c up "modem${port: -1}"
答案1
我想到了。
Udev 适用于短任务,脚本速度变慢会导致系统其余部分无法识别调制解调器已插入。根据 udev 手册
将程序添加到要为特定设备执行的程序列表中。这只能用于非常短的运行任务。长时间运行事件进程可能会阻止此设备或相关设备的所有后续事件。长时间运行的任务需要立即与事件进程本身分离。如果指定了选项 RUN{fail_event_on_error},并且执行的程序返回非零,则事件将被标记为失败,以便稍后处理。
仅分离该过程不起作用,相反,我可以使用at
。有关如何使用的示例,请参阅此答案at
:方便地安排命令稍后运行?