从 udev 规则启动的脚本未显示在终端中?

kur*_*rja 4 scripts udev

我编写了一个脚本来运行 rsync,并read line在最后添加以在运行后保持输出可见;当我手动运行脚本时,这按预期工作。

我已经制定了 udev 规则RUN+="/home/user/bin/scriptfile"来运行我上面的脚本,并且脚本确实按预期运行,但输出未显示在终端窗口中。为什么不呢,我怎样才能做到呢?

编辑 - 澄清:我尝试从 udev 规则启动各种不同的脚本,它运行良好,脚本运行并执行我期望的操作。问题是,当脚本运行时,我可以将输出打印到我的屏幕上吗?我可以将输出定向到一个日志文件,这也可以,但我希望在脚本运行时让它在屏幕上可见。

b_l*_*shi 5

首先,你为什么看不到输出?正如 Sergiy Kolodyazhnyy 在评论中指出的那样,由 udev 启动的脚本“不会继承所有相同的环境变量,这意味着它们无法知道您正在运行的 GUI 会话的位置和位置。” 简单来说,udev 对桌面 GUI 一无所知。

我目前正在执行类似于您要求插入我的系统的 USB 设备的操作。对于我正在运行的应用程序,我需要知道 USB 是否具有有效的序列号。无论如何,这就是我如何做到的。

概述:

  • 我启动了一个帮助脚本,该脚本创建了一个命名管道并监视该命名管道以用于“消息”穿过它。
  • 我已将 udev 配置为“发送消息”(写行)到我的命名管道(在我的情况下为 USB sn 和分区信息)。
  • 我的助手脚本看到每一行文本进来,我使用通知发送以通知的形式在我的屏幕上转储消息。

如果您只想在终端窗口中查看它,您可以告诉您的辅助脚本在终端窗口中简单地从命名管道中回显文本。


示例代码:

#!/bin/bash
#This script should be called once without an argument to get it running in a "service" mode
#Successive calls to this script by UDEV sould pass a string as the first argument.
#   These strings will then be displayed in the window running in service mode.

pipe=/tmp/messages

if [ "$1" == "" ]; then

    [ ! -e  "$pipe" ] && mkfifo "$pipe"

    while true # this loop continuously reads new lines and echos them
    do
        line=$(cat "$pipe")
        echo "$line"
    done
fi

# you won't reach this line unless you call this script with one argument
echo "$1" >> "$pipe"
Run Code Online (Sandbox Code Playgroud)

运行这个脚本:

  • 将上述内容保存在一个文件中/tmp/sample_script.sh(将在重新启动时删除)
  • 使脚本可执行 chmod +x /tmp/sample_script.sh
  • 调用脚本使其在服务模式下运行(即不带任何参数) /tmp/sample_script.sh
  • 从另一个终端窗口/脚本/udev,运行/tmp/sample_script.sh "message to send"(注意我们在这里传递字符串参数“要发送的消息”)
  • 回头看一下服务窗口,您会看到窗口中出现了字符串“要发送的消息”。

从 udev 运行脚本时,您将无法让第二个实例直接在屏幕上输出任何内容,而无需通过命名管道将其重定向,因为您的 udev 脚本是从与 GUI 环境完全分离的环境中调用的正在运行。在脚本中创建并在两种环境中使用的命名管道就像是两者之间的桥梁,允许您将信息从 udev 环境传递到您正在查看的 GUI 环境。