Bash

從 udev 規則執行時腳本中的 dd 命令未執行

  • April 16, 2018

我想設置一個執行 Rasbian 的 Raspberry Pi 3,以便在將磁碟插入耦合磁碟站時自動複製 DVD 磁碟。為此,我編寫了一個 udevrule 和一個腳本,以便在觸發此規則時執行。

udev 規則似乎工作正常,並在插入磁碟時執行腳本。

該腳本包含dd命令。當我從命令行手動執行腳本時,它可以正常工作並執行dd命令。但是,當腳本通過udev磁碟插入執行時,腳本中的所有內容都會執行,除了dd命令。

我在網上搜尋過,但找不到其他有同樣問題的人。有人知道問題可能是什麼嗎?

udev 規則/etc/udev/rules.d/65-autorip.rules

SUBSYSTEM=="block", KERNEL=="sr[0-4]", ACTION=="change", RUN+="/usr/local/bin/autorip/autorip.sh /dev/%k %E{ID_CDROM_MEDIA}"

磁碟複製腳本/usr/local/bin/autorip/autorip.sh

#!/bin/bash

# function to activate a led and eject disk when an error occurs
error(){
   python /usr/local/bin/autorip/led-on.py
   eject
}

# function to deactivate the led for
reset_led(){
   python /usr/local/bin/autorip/led-off.py
}

# if udev flag to check if disk change action is insert (second script parameter) is set
if [ $2 == "1" ]; then
   reset_led
   #use wodim command to find out if disk is DVD
   disk_info=$(wodim -atip dev='/dev/sr0')
   if [[ $disk_info = *"mmc_mdvd"* ]] ; then
           # copy disk contents to temp location (not working when ran from udev)
           dd if=/dev/sr0 of=/tmp/autorip_disk_image_$RANDOM$RANDOM.iso
           eject
   else
           error
   fi
fi

udev規則不適用於執行時間較長的任務,例如複製 DVD。來自man udev

這只能用於執行時間很短的前台任務。長時間執行事件程序可能會阻止此設備或從屬設備的所有進一步事件。

udev 不適合啟動守護程序或其他長時間執行的程序;事件處理完成後,分叉的程序,無論是否分離,都將被無條件終止。

此外,執行的腳本udev執行在受限制的環境中。

因此,正確的做法是製定一個 udev 規則,觸髮使用者已經啟動的程序(通過 D-Bus、套接字、命名管道或其他方式);然後該程序可以依次複製 DVD。這也解決了授予 DVD 複製程序適當權限的問題。

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