¿Por qué falla mi script cuando se ejecuta desde udev?

Sep 24 2020

Estoy escribiendo un script bash y estoy comprobando si la aplicación se está ejecutando. Si no se está ejecutando, debe iniciarse en un proceso separado (no en un proceso hijo). Si se está ejecutando, la ventana debe maximizarse. Lo logré, pero el nuevo proceso termina poco después de iniciarse, probablemente porque el proceso del script termina. Cuando no lo ejecuto en segundo plano a través de &, la aplicación no se cierra, pero luego no puedo ejecutar el script por segunda vez para maximizar la aplicación.

#!/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

Cuando lo ejecuto en una terminal, funciona bien. Cuando lo llamo desde la regla udev, la aplicación termina. Usar nohup produce el mismo resultado. Aquí está la regla udev

ACTION=="add" \
, KERNEL=="hci0:3585" \
, SUBSYSTEM=="bluetooth" \
, ENV{DISPLAY}=":0" \
, ENV{HOME}="/home/user"
, RUN+="/home/user/runapp"

Respuestas

neolith Sep 27 2020 at 17:56

Encontré una solución aquí por fin. Necesita un segundo script que contenga

#!/bin/bash
echo /pathto/runApp | at now

Este script debe llamarse desde la regla udev. Para que funcione attiene que estar instalado y tiene que habilitarlo atdllamando sudo systemctl enable atd --now. Es un poco hacky, pero al menos funciona.

Eliminé el enfoque systemd para que la publicación sea una guía más fácil.