長期アプリケーションを実行するためのスクリプトを、udev イベントを介して複数回実行する最適な方法は何ですか?

長期アプリケーションを実行するためのスクリプトを、udev イベントを介して複数回実行する最適な方法は何ですか?

ボタンを押すと USB 経由で接続するデバイスがあります。ボタンを放すとすぐに接続が切断されます。このボタンを押すとグラフィカル アプリケーションを起動したいです。

ボタンに正常にアクセスしてアプリケーションを起動できました。問題は、ボタンを複数回押すと、udev がイベントをキューに入れたり、処理できるようになるまでイベントを保持したりするため、アプリケーションが閉じられた後に何度も再起動することです。

そこで、アプリケーションが実行中かどうかを確認するbashスクリプトを作成しました。実行中でない場合はアプリケーションを起動します。実行中の場合はアプリケーションを最大化します。ここでも同じ問題が発生したため、を使用してアプリケーションをバックグラウンドで起動しようとしました&が、udevルールが終了すると強制終了されます。nohup

おそらく、ここでは bash スクリプトは最善の方法ではありません。別のプロセスで長期アプリケーションを開始して、スクリプトを終了して再度実行できるスクリプトが必要です。可能であれば、Linux ネイティブ メソッドでもあり、依存関係をさらにインストールする必要がありません。

このスレッドを見つけましたUdev イベントで長時間プロセスを実行するにはどうすればいいですか?同じ問題を扱っています。どうやら を使って解決したようですcmd | at nowが、cronie には cron のようなこのコマンドがないので、このコマンドは非推奨のようです。

インストールする必要があるパッケージであることがわかったのですが、アプリケーションも複数回起動し、スクリプトが完了しません。

私は 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

関連情報