我有一个按下按钮时通过 USB 连接的设备。当按钮被释放时,它会立即停止连接。我想在按下此按钮时启动图形应用程序。
我可以成功访问按钮并启动应用程序。问题是,当我多次按下按钮时,应用程序在关闭后会一次又一次地重新启动,因为 udev 显然会将事件排队或保留它们直到可以处理它们。
所以我编写了一个 bash 脚本来检查应用程序是否正在运行。当它不运行时,它会启动应用程序。当它运行时,它会最大化应用程序。这里发生了同样的问题,所以我尝试在后台启动应用程序&
,但当 udev 规则完成时它被杀死。与相同nohup
也许 bash 脚本不是最好的方法。我需要一个可以在单独的进程中启动长期应用程序的脚本,以便该脚本可以完成并再次运行。如果可能的话,它也应该是 Linux 本机方法,这样我就不必安装更多依赖项。
我找到了这个线程如何在 Udev 事件上运行长时间进程?处理同样的问题。他似乎用 using 解决了这个问题cmd | at now
,但这个命令似乎已被弃用,因为 cronie 没有像 cron 这样的命令。
我刚刚发现 at 是一个需要安装的包,但是应用程序也启动了多次并且脚本没有完成。
我正在运行 Manjaro,所以基本上是 Arch。
答案1
为了解决 udev 对事件进行排队的问题,我使用RUN+="/local/run.sh /local/main-script.sh"
run.sh 包含的事件
#!/bin/bash
echo $1 | at now
你sudo apt-get install at
首先需要。
为了避免多次运行,你需要类似的东西
if [ -f /opt/running_on ]; then
exit
else
echo run > /opt/running_on
# put your commands here
sleep 10
rm /opt/running_on
fi