
Я пишу скрипт bash и проверяю, запущено ли приложение. Если оно не запущено, оно должно быть запущено в отдельном процессе (не дочернем процессе). Если запущено, окно должно быть развернуто. Я как-то сделал это, но новый процесс завершается вскоре после запуска, вероятно, из-за завершения процесса скрипта. Когда я не запускаю его в фоновом режиме через &, приложение не закрывается, но тогда я не могу запустить скрипт второй раз, чтобы развернуть приложение.
#!/bin/bash
if pgrep app
then
echo app is running
# Maximize the app
wmctrl -x -r WMClassOfapp -b "add,maximized_vert,maximized_horz"
else
echo app is not running
/usr/bin/app
fi
Когда я запускаю его в терминале, он работает нормально. Когда я вызываю его из правила udev, приложение завершается. Использование nohup дает тот же результат. Вот правило udev
ACTION=="add" \
, KERNEL=="hci0:3585" \
, SUBSYSTEM=="bluetooth" \
, ENV{DISPLAY}=":0" \
, ENV{HOME}="/home/user"
, RUN+="/home/user/runapp"
решение1
Я нашел здесь обходной путь наконец. Вам нужен второй скрипт, который содержит
#!/bin/bash
echo /pathto/runApp | at now
Этот скрипт должен быть вызван из правила udev. Для работы он at
должен быть установлен и должен быть включен atd
вызовом sudo systemctl enable atd --now
. Он немного хакерский, но по крайней мере работает.
Я удалил подход systemd, чтобы пост стал более простым руководством.