Debian

如何在 Debian Jessie (Raspberry Pi) 中自動執行腳本(插入 USB 記憶體時)?

  • June 1, 2016

我正在使用樹莓派。以前,我曾經udev rule在插入 USB 快閃記憶體時執行腳本。以下是/etc/udev/rules.d/10-usbstick.rules文件的內容:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1" SYMLINK+="usbflash", RUN+="/path/to/myhup.sh"

然後在myhup.sh

#!/bin/sh
nohup /path/to/myscript.sh

這種方法效果很好。當插入 USB 快閃記憶體時,它會自動開始執行myscript.sh文件。

但是,升級到 Jessie 後,它不起作用。插入USB快閃記憶體時,會出現以下錯誤:

[ 2026.652130] sd 0:0:0:0: [sda] No Caching mode page found
[ 2026.652238] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 2029.532163] ntfs: (device sda1): check_mft_mirror(): $MFT and $MFTMirr (record 0) do not match.  Run ntfsfix or chkdsk.
[ 2029.532355] ntfs: (device sda1): load_system_files(): $MFTMirr does not match $MFT.  Mounting read-only.  Run ntfsfix and/or chkdsk.

我決定使用systemd service方法。所以我將其更改udev rule為:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1" SYMLINK+="usbflash", RUN+="systemctl start myusb.service"

並創建了myusb.service以下內容:

[Unit]
Description=run myscript
[Service]
Type=oneshot
ExecStart=/path/to/myscript.sh
[Install]
WantedBy=multi-user.target

進而:

sudo chmod 644 /lib/systemd/system/myusb.service
sudo systemctl daemon-reload
sudo systemctl enable myusb.service
sudo reboot

這次又不行了,報如下錯誤:

[ 2026.652130] sd 0:0:0:0: [sda] No Caching mode page found
[ 2026.652238] sd 0:0:0:0: [sda] Assuming drive cache: write through

那麼,如何在插入 USB 快閃記憶體時自動執行腳本(在 Jessie 中)?

如果您想從您的 udev 執行一個 systemd 單元,您現在只需命名該單元(請參閱 參考資料man systemd.device)。例如,如果您查看您的 (/usr) /lib/udev/rules.d/99-systemd.rules,您應該找到一個類似的範例

SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_WANTS}+="bluetooth.target"

其中有兩個重點:您必須添加TAGsystemd,並且必須將 the 設置SYSTEMD_WANTS為您的單位的(基本)名稱。如果沒有使用規則SYSTEMD_WANTS,那麼您的版本可能還不支持此功能。

所以在你的情況下,我們有

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", SYMLINK+="usbflash", TAG+="systemd", ENV{SYSTEMD_WANTS}+="myusb.service"

請注意,您在 udev 規則中缺少逗號。請注意,您列出的 2 個錯誤[sda]只是提供資訊,而不是問題。

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