Bash
從 udev 規則執行時腳本中的 dd 命令未執行
我想設置一個執行 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 複製程序適當權限的問題。