Shell-Script

執行顯示來自 udev 規則的 X 視窗的腳本

  • February 2, 2017

我在http://unix.stackexchange.com>和<http://stackoverflow.com上發現了幾個與 udev 規則啟動腳本相關的問題。但是我找不到執行Bash腳本的確切解決方案或特定答案。

所以,我在問一個(規範的)問題:如何通過 udev 規則執行/啟動/執行 Bash 腳本?

我在編寫 udev 規則時發現的另一件事是:

udev 不會在任何活動終端上執行這些程序,也不會在 shell 的上下文中執行它們。確保您的程序被標記為可執行,如果它是一個 shell 腳本,請確保它以適當的 shebang 開頭(例如 #!/bin/sh),並且不要期望任何標準輸出出現在您的終端上。

因此,我想知道是否可能“如何通過 udev 規則執行bash 腳本?”


這是執行 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在我的pendrive(上面列出的SanDisk)連接時執行實驗命令。

所以,我寫了/home/pandya/example.shRUN+=在 udev 規則中呼叫)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 規則的menas 執行 Bash 腳本?** 如果我缺少任何東西,請建議我。

最有可能的是,該命令正在執行,但不知道在哪裡顯示輸出。我假設您使用 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"'

我最近發現了一種優雅的方式來顯示來自 udev 規則的 GUI 或 X 任務,而不必擔心 DISPLAY。對於使用export.

IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"

$env{ENV}: 如果 current-tty-user 啟動 X,否則為root刪除它。

引用自:https://unix.stackexchange.com/questions/177897