
ボタンを押すと 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