インストール後、USBにフォルダを作成しようとします。**ID_FS_UUID_ENC** (64AC6F22AC6EEE4C)
パラメータとして送信し、start.sh
このパスにサブフォルダを作成する次のudevルールを使用しています。/media/pi/64AC6F22AC6EEE4C
KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"
# Import FS infos
IMPORT{program}="/sbin/blkid -o udev -p %N"
# Get a label if present, otherwise specify one
#ENV{ID_FS_UUID_ENC}!="", ENV{dir_name}="%E{ID_FS_UUID_ENC}"
#ENV{ID_FS_UUID_ENC}=="", ENV{dir_name}=""
# Global mount options
ACTION=="add", DRIVERS=="usb-storage", RUN+="/usr/bin/setsid /home/pi/raspberry-stilas/start.sh %E{ID_FS_UUID_ENC}"
ACTION=="add", DRIVERS=="usb-storage", RUN+="/bin/sh -c 'echo == >> /home/pi/raspberry-stilas/usb-storage-env.log; env >> /home/pi/raspberry-stilas/usb-storage-env.log'"
# Exit
LABEL="media_by_label_auto_mount_end"
これで問題は、USBを接続するとstart.sh
新しいフォルダが作成され、転送されたフォルダの名前が変更されることです。だから64AC6F22AC6EEE4C
新しいフォルダを作成し、USBラベルの名前を64AC6F22AC6EEE4C1
。 USBがマウントされていない状態でフォルダを作成しようとしていますか?
修正する
システムログとカスタムログを確認すると、スクリプトが実行された後にデバイスがインストールされているようです。インストール後にのみ実行する方法はありますか?
Custom Log - Stilas Python program run at 2019-05-18 11:33:01 PM
Syslog - May 18 23:33:02 raspberrypi udisksd[725]: Mounted /dev/sda1 at /media/pi/64AC6F22AC6EEE4C1 on behalf of uid 1000
追加後ログインsleep 5
May 19 01:33:40 raspberrypi kernel: [ 944.893519] usb 1-1.2: USB disconnect, device number 8
May 19 01:33:42 raspberrypi kernel: [ 947.749507] usb 1-1.2: new high-speed USB device number 9 using dwc_otg
May 19 01:33:43 raspberrypi kernel: [ 947.880955] usb 1-1.2: New USB device found, idVendor=0781, idProduct=558a
May 19 01:33:43 raspberrypi kernel: [ 947.880971] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
May 19 01:33:43 raspberrypi kernel: [ 947.880980] usb 1-1.2: Product: Ultra
May 19 01:33:43 raspberrypi kernel: [ 947.880988] usb 1-1.2: Manufacturer: SanDisk
May 19 01:33:43 raspberrypi kernel: [ 947.880997] usb 1-1.2: SerialNumber: 4C530001270213117013
May 19 01:33:43 raspberrypi kernel: [ 947.881806] usb-storage 1-1.2:1.0: USB Mass Storage device detected
May 19 01:33:43 raspberrypi kernel: [ 947.882227] scsi host1: usb-storage 1-1.2:1.0
May 19 01:33:43 raspberrypi mtp-probe: checking bus 1, device 9: "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2"
May 19 01:33:43 raspberrypi mtp-probe: bus: 1, device: 9 was not an MTP device
May 19 01:33:44 raspberrypi kernel: [ 948.890623] scsi 1:0:0:0: Direct-Access SanDisk Ultra 1.00 PQ: 0 ANSI: 6
May 19 01:33:44 raspberrypi kernel: [ 948.891609] sd 1:0:0:0: Attached scsi generic sg1 type 0
May 19 01:33:44 raspberrypi kernel: [ 948.891730] sd 1:0:0:0: [sdb] 120127488 512-byte logical blocks: (61.5 GB/57.3 GiB)
May 19 01:33:44 raspberrypi kernel: [ 948.892813] sd 1:0:0:0: [sdb] Write Protect is off
May 19 01:33:44 raspberrypi kernel: [ 948.892828] sd 1:0:0:0: [sdb] Mode Sense: 43 00 00 00
May 19 01:33:44 raspberrypi kernel: [ 948.893398] sd 1:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
May 19 01:33:44 raspberrypi kernel: [ 948.902832] sdb: sdb1
May 19 01:33:44 raspberrypi kernel: [ 948.905690] sd 1:0:0:0: [sdb] Attached SCSI removable disk
start.sh
#!/bin/sh
sleep 5
echo "Device Mounted on - `date +"%Y-%m-%d %r."` Path - /media/pi/{$1}" env >> /home/pi/raspberry-stilas/mount.log
if [ "$1" != "" ]; then
echo "Stilas Python program run at `date +"%Y-%m-%d %r."` Path - /media/pi/{$1}" env >> /home/pi/raspberry-stilas/mount.log
python3 /home/pi/raspberry-stilas/stilas/stilas.py "/media/pi/$1"
fi
答え1
ライン2(ライン1)/home/pi/start.sh
にshebangがあり、実行ビット()が設定されているとします。#!/bin/sh
sleep 5
chmod +x /home/pi/start.sh
を使用するとsetsid
フォークされます。これは、スクリプトの実行がバックグラウンドで実行されることを意味します。上記の省電力モードは、システムにUSBデバイスをマウントする時間を提供するためのものです。 Udevは、デバイスをマウントする前にスクリプトが完了するのを待たずにsetsid
すぐに返され、デバイスはすばやくマウントする必要があります。
ACTION=="add", DRIVERS=="usb-storage", RUN+="/usr/bin/setsid /home/pi/start.sh %E{ID_FS_UUID_ENC}"
編集:udevはすべての子プロセスを待つので、プロセスは独自のグループを作成する必要があります。
/home/pi/start.sh
次のヘッダーがあることを確認してください。
#!/bin/sh
pgid_from_pid() {
local pid=$1
ps -o pgid= "$pid" 2>/dev/null | egrep -o "[0-9]+"
}
pid="$$"
if [ "$pid" != "$(pgid_from_pid $pid)" ]; then
exec setsid "$(readlink -f "$0")" "$@"
fi
sleep 5
init.shスクリプトを生成します。
#!/bin/sh
/home/pi/start.sh "$@"
私達は次のudev規則を結合します:
ACTION=="add", DRIVERS=="usb-storage", RUN+="/bin/sh /home/pi/init.sh %E{ID_FS_UUID_ENC}"
答え2
最新のudevシステムでは、機能しなくなった回答をフォークすることをお勧めします。
RUN
...
Starting daemons or other long running processes is not appropriate for
udev; the forked processes, detached or not, will be unconditionally killed
after the event handling has finished.
一般的なsystemdサービスを使用してmount
デバイスをインストールできます。以下を使用できます。sudo systemctl list-units -t mount
デバイスのsystemdインストールを見つけて名前を書きます。
それから/etc/systemd/system/your.service
「
[Unit]
Description=My mount script trigger
Requires=<whatever the command above returned>.mount
After=<whatever the command above returned>.mount
[Service]
ExecStart=/home/pi/start.sh
[Install]
WantedBy=<whatever the command above returned>.mount
利点:設定が簡単
欠点:特定の名前を持つUSBデバイスにのみ適用されます。スクリプトからUUIDを直接調べる必要があります。
答え3
接続されたUSBフラッシュドライブ(自律BBBデバイスに接続されている)に反応する何かを実装する必要があります。デバイス名を取得し、そこにファイルシステムをマウントし、そこにrsync操作を実行し、マウント解除します。
並行性の問題(並列にデバイスと競合する複数の問題)、適切なエラーロギング、およびその他の起動問題を回避するための最も確実な方法は、スクリプトをシステムワンショットサービスにラップすることです。
私にすぐに明確ではない唯一の問題は、デバイスを適切なサービスに正しく配信する方法です。
Googleの結果を調べた後(記事も見つかった)、最終的には最善のアプローチであると思われる「udevのSYSTEMD_WANTSとsystemdのテンプレートユニットペアリング」解析スレッドを見つけました。
私の状況に合わせて調整し、デバイスインスタンス化サービスの一般的なパターンと組み合わせて、次の設定を得ました。
udevルール:
ACTION=="add", PROGRAM="/usr/bin/systemd-escape -p [email protected] %E{ID_FS_UUID_ENC}", ENV{SYSTEMD_WANTS}+="%c"
[Unit]
BindTo=%i.device
After=%i.device
[Service]
Type=oneshot
TimeoutStartSec=300
ExecStart=/home/pi/raspberry-stilas/start.sh /%I
から適応ここ。