为什么我的脚本从 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。这有点hacky,但至少它有效。

我删除了 systemd 方法,因此这篇文章将是一个更简单的指南。

相关内容