修正する

修正する

インストール後、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/shsleep 5chmod +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}"

おすすめ記事