Каков наилучший способ многократного запуска скрипта, предназначенного для запуска долгосрочного приложения, через событие udev?

Каков наилучший способ многократного запуска скрипта, предназначенного для запуска долгосрочного приложения, через событие udev?

У меня есть устройство, которое подключается через USB при нажатии кнопки. Оно немедленно прекращает соединение, когда кнопка отпускается. Я хочу запустить графическое приложение при нажатии этой кнопки.

Я смог успешно получить доступ к кнопке и запустить приложение. Проблема в том, что когда я нажимаю кнопку несколько раз, приложение снова и снова перезапускается после закрытия, потому что udev, по-видимому, ставит события в очередь или удерживает их до тех пор, пока они не будут обработаны.

Поэтому я написал скрипт bash, который проверяет, запущено ли приложение. Когда оно не запущено, он запускает приложение. Когда оно запущено, он разворачивает приложение. Здесь возникла та же проблема, поэтому я попытался запустить приложение в фоновом режиме с помощью &, но затем оно было завершено, когда правило udev завершилось. То же самое сnohup

Возможно, скрипт bash здесь не лучший способ. Мне нужен скрипт, который может запустить долгосрочное приложение в отдельном процессе, чтобы скрипт мог завершиться и быть запущен снова. Он должен, если возможно, также быть нативным методом Linux, чтобы мне не пришлось устанавливать больше зависимостей.

Я нашел эту веткуКак запустить длительный процесс по событию Udev?который решает ту же проблему. Он, по-видимому, решил ее с помощью 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

Связанный контент