我发现了几个问题http://unix.stackexchange.com& 在http://stackoverflow.com与 udev 规则的启动脚本相关。但我找不到执行的确切解决方案或特定答案重击脚本。
所以,我问这个(规范的)问题:如何通过 udev 规则运行/启动/执行 Bash 脚本?
我发现的另一件事编写 udev 规则是:
udev 不在任何活动终端上运行这些程序,并且不在 shell 上下文中执行它们。请确保您的程序被标记为可执行,如果它是 shell 脚本,请确保它以适当的 shebang 开头(例如 #!/bin/sh),并且不要期望任何标准输出出现在您的终端上。
因此,我想知道是否可能“如何运行bash脚本按照 udev 规则?”
这是执行 bash 脚本的简单示例。
我写过99-myrule.rules
,其中/etc/udev/rules.d
包含:
ACTION=="add", ATTR{idVendor}=="0781", ATTR{idProduct}=="5567", RUN+="/home/pandya/example.sh"
lsusb
我从输出中找到了供应商和产品 ID :
$ lsusb | grep SanDisk
Bus 001 Device 066: ID 0781:5567 SanDisk Corp. Cruzer Blade
我想zenity --info
在连接我的随身碟(上面列出的 SanDisk)时执行实验命令。
所以,我写了/home/pandya/example.sh
(在 udev 规则中调用RUN+=
)contians:
#!/bin/bash
zenity --info &
exit
但是这个脚本没有执行(尽管有执行权限)。我也尝试过以下操作:
export DISPLAY=:0
在之前的脚本中zenity --info
bash -c 'DISPLAY=:0 zenity --info
而且当然:
sudo restart udev
sudo udevadm control --reload-rules
但我无法获得输出zenity --info
。
因此如何通过 udev 规则运行 Bash 脚本? 如果我遗漏了什么,请建议我。
答案1
最有可能的是,该命令正在执行,但不知道在哪里显示输出。我假设您正在使用 root 以外的用户登录 X,并且该规则很可能以 root 身份运行。尝试以下命令:
su - your_X_user_here -c 'export DISPLAY=:0;zenity --info'
对于运行任何bash脚本按照命令:
su - your_X_user_here -c 'export DISPLAY=:0; bash -c "/path/to/script.sh"'
答案2
我最近发现一种优雅的方式从 udev 规则显示 GUI 或 X 任务,而不必担心 DISPLAY。对于使用 的 Shell 脚本,其原理是相同的export
。
IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"
$env{ENV}
:如果当前tty用户启动X,否则将其删除根。
答案3
对于阅读本文的其他人来说,我能够让我的脚本在 Kali Linux 2016 中运行的唯一方法是这样的:
#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'