我正在使用Raspberry Pi。以前,我曾经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"
其中有2个要点:必须添加TAG
systemd,并且必须将设置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]
仅是信息性的,而不是问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句