Debian Jessie(Raspberry Pi)でスクリプトを自動的に実行する方法(USBメモリが接続されている場合)は何ですか?

Debian Jessie(Raspberry Pi)でスクリプトを自動的に実行する方法(USBメモリが接続されている場合)は何ですか?

ラズベリーパイを使っています。以前は、udev ruleUSBフラッシュドライブを接続するとスクリプトが実行されていました。ファイルの内容は次のとおりです/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]ないことに注意してください。

おすすめ記事