私はRaspberryPiを使用しています。以前は、USBフラッシュメモリが接続されたときにudev rule
を使用してスクリプトを実行していました。 /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フラッシュメモリが(ジェシーに)接続されているときにスクリプトを自動的に実行するにはどうすればよいですか?
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ルールにコンマがないことに注意してください。 [sda]
にリストする2つのエラーは単なる情報であり、問題ではないことに注意してください。