bash - 执行 shell 脚本以使用 cron 自动连接到我的蓝牙扬声器
问题描述
我最近使用 Ubuntu 18.04.3 LTS 设置了我的笔记本电脑,我希望它在启动时自动连接到我的蓝牙扬声器,并且到目前为止一切正常,除了能够在启动时运行我的脚本。这是我编写的脚本(或者更确切地说是结合了我在网上找到的一些片段)并使其可执行(sudo chmod u+x path/to/my/script.sh
):
#!/bin/bash
# enable bluetooth
sudo systemctl start bluetooth
#15 sec is enough in my case
sleep 15
# run the program bluez
echo -e 'power on\nconnect MA:CO:OF:MY:DE:VI:CE \nquit' | bluetoothctl
我将蓝牙接收器添加为受信任的设备,并且之前已经将它与我的系统配对。到目前为止,当我运行它时,该脚本仍在工作./path/to/my/script.sh
所以我想我会用 cron 执行它。我将此行添加到我的 cron 文件中(通过crontab -e
):
@reboot /bin/sh /path/to/my/script.sh
但它似乎不起作用。我认为我的 cron 版本可能有问题,所以我写了一个小控制脚本:
touch /some/path/file.txt
使其可执行并将其添加到 cron 文件中,它以两种方式工作(1)在重新启动时和(2)在特定时间:
(1)@reboot /bin/sh /path/to/control_script.sh
(2)MM HH * * * /bin/sh /path/to/control_script.sh
'file.txt' 是在两个测试中创建的,但由于某种原因,当我尝试使用 cron 调用它时,我将笔记本电脑连接到蓝牙接收器的脚本无法正常工作。有没有人知道可能导致这种情况的原因?或者也许有解决方法?
编辑:如果我将脚本安排到我的电脑已经开始工作的特定时间,这似乎是蓝牙打开很晚的问题。exit 0
我也在脚本末尾删除了,因为我认为没有必要
第二次编辑:此外,当我将睡眠时间设置得非常高(在我上次测试中为 100)时,它也可以正常工作,所以我想我会尝试一下并找到一个可以接受且仍然有效的睡眠时间。问题也可能是sudo systemctl start bluetooth
当我在终端中输入蓝牙时似乎没有激活蓝牙。所以也许有人知道为什么会这样?此外,当我输入power on
bluetoothctl 控制台时,Failed to set power on: org.bluez.Error.Blocked
即使我输入它时也会说sudo bluetoothctl
所以脚本到目前为止都在工作,但只有在上一个会话中打开了蓝牙,否则它不会激活蓝牙,因此不会做任何事情。
解决方案
我使用以下脚本将蓝牙连接切换到扬声器 Ubuntu 20.04。它检查连接是否已经建立并相应地切换它。
请注意,它具有硬编码的扬声器的 MAC 地址。
!/bin/bash
# Toggle connection to bluetooth device
mac="90:03:B7:17:00:08" # DEH-4400BT
if bluetoothctl info "$mac" | grep -q 'Connected: yes'; then
echo "Turning off $mac"
bluetoothctl disconnect || echo "Error $?"
else
echo "Turning on $mac"
# turn on bluetooth in case it's off
rfkill unblock bluetooth
bluetoothctl power on
bluetoothctl connect "$mac"
sink=$(pactl list short sinks | grep bluez | awk '{print $2}')
if [ -n "$sink" ]; then
pacmd set-default-sink "$sink" && echo "OK default sink : $sink"
else
echo could not find bluetooth sink
exit 1
fi
fi
推荐阅读
- server-sent-events - 使用 Koa 处理服务器发送的事件
- react-native - React Native 按钮错误问题,不能有点击监听
- python-multithreading - Python:运行一个在新线程中接受参数的类方法
- c++ - GCM 中的 Crypto++ AES 正在生成类似的密文
- java - 制作一个服务模拟列表以随机返回所需的值?
- spring-boot - ${LOG_PATH} 的 logging.path
- matlab - 如何获取存储在 4D 矩阵中的矩阵的索引?
- java - 转换地图> 到地图> 使用流
- tree - 我的归纳证明中的错误在哪里?
- mongodb - 使用 zsh 在 Mac 上找不到 Mongo 命令?