Почему мой скрипт не работает при запуске из udev?

Почему мой скрипт не работает при запуске из udev?

Я пишу скрипт 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, чтобы пост стал более простым руководством.

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