如何在 Debian Jessie (Raspberry Pi) 中自动运行脚本(当插入 USB 内存时)?

如何在 Debian Jessie (Raspberry Pi) 中自动运行脚本(当插入 USB 内存时)?

我正在使用树莓派。以前,我曾经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 中)?

答案1

如果您想从 udev 运行一个 systemd 单元,您现在只需命名该单元即可(请参阅 参考资料man systemd.device)。例如,如果您查看 (/usr),/lib/udev/rules.d/99-systemd.rules您应该会找到类似的示例

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

其中有两个要点:您必须添加 systemd TAG,并且必须将 设为SYSTEMD_WANTS您的单元的(基本)名称。如果没有规则 use SYSTEMD_WANTS,那么您的版本可能还不支持此功能。

所以对于你的情况我们有

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

请注意,udev 规则中缺少逗号。请注意,您列出的 2 个错误[sda]仅供参考,并不是问题。

相关内容