執行顯示來自 udev 規則的 X 視窗的腳本
我在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.sh
(RUN+=
在 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刪除它。