当调制解调器管理器检测到调制解调器时运行脚本

当调制解调器管理器检测到调制解调器时运行脚本

我需要运行一个脚本,当调制解调器管理器检测到调制解调器时(即mmcli -L列出调制解调器)创建一个连接。我目前已设置了一条 udev 规则来执行此操作,但mmcli注册调制解调器花费的时间太长,以至于脚本已经运行完毕。

我希望有办法做以下事情之一:

  1. 延迟从 udev 启动脚本
  2. 允许脚本在后台运行或进入睡眠状态直到mmcli看到调制解调器(我一直试图让它工作,但是对该sleep函数的调用被跳过,并且它不允许我在不同的线程中运行)
  3. 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方便地安排命令稍后运行?

相关内容