ラズベリーパイを使っています。以前は、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"
これには2つの重要なことがあります。 systemdを追加し、ユニットの(デフォルト)名前TAG
に設定する必要があります。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]
ないことに注意してください。