通过 udev 事件多次运行旨在运行长期应用程序的脚本的最佳方法是什么?

通过 udev 事件多次运行旨在运行长期应用程序的脚本的最佳方法是什么?

我有一个按下按钮时通过 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

相关内容