web-dev-qa-db-ja.com

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

私は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フラッシュメモリが(ジェシーに)接続されているときにスクリプトを自動的に実行するにはどうすればよいですか?

2
Omid1989

Udevからsystemdユニットを実行する場合は、ユニットに名前を付けるだけで済みます(man systemd.deviceを参照)。たとえば、(/ usr)/lib/udev/rules.d/99-systemd.rulesを見ると、次のような例が見つかります。

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

これには2つの重要なポイントがあります。TAGsystemdを追加する必要があり、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つのエラーは単なる情報であり、問​​題ではないことに注意してください。

1
meuh