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 접근 방식을 삭제했습니다.

관련 정보