私のシステムに複数のUSBが接続されています。特定の.iniファイルが含まれているか空のUSB(この場合は.iniファイルを作成したい場合)を見つけて、/media/mount_pointにマウントしたいと思います。そのUSBがない場合は何もインストールしないでください。
各USBに対して次のスクリプトを実行するudevルールを作成しました。
#!/bin/sh
LOGFILE="/home/user/mount.log"
MOUNTDIRECTORY="/media/mount_point"
if [ -z "$DEVNAME" ]; then
exit
fi
echo "USB device detected at $DEVNAME" >> $LOGFILE
if grep '$MOUNTDIRECTORY ' /proc/mounts; then
# Already mounted
echo "Mount directory already in use" >> $LOGFILE
exit
fi
mount $DEVNAME $MOUNTDIRECTORY -o umask=0000,gid=1000,uid=1000 &>> $LOGFILE
if [ $? -eq 0 ]; then
echo "$DEVNAME mounted at $MOUNTDIRECTORY" >> $LOGFILE
if [ -f $MOUNTDIRECTORY/log.ini ]; then
echo "Log.ini found. Ready to log" >> $LOGFILE
break
elif [ -z "$(ls -A $MOUNTDIRECTORY)" ]; then
echo "USB device empty. Creating log.ini" >> $LOGFILE
touch $MOUNTDIRECTORY/log.ini
break
else
umount $MOUNTDIRECTORY
fi
else
echo "Failed to mount $DEVNAME at $MOUNTDIRECTORY" >> $LOGFILE
fi
echo "" >> $LOGFILE
.iniが存在する場合は機能します(systemd-udevd.service編集後)。この問題)、しかし空のUSBが見つかった場合はそうではありません。 $LOGFILE 出力では .ini が生成されたと報告しますが、確認してみるとマウントされたデバイスに .ini ファイルがありません。削除すると、マウントポイントに.iniファイルが作成されたことがわかります。
.iniファイルがマウントされたUSBの代わりにマウントポイントにあるのはなぜですか?この問題をどのように解決できますか?
それとも、この問題に対するudevよりも優れたアプローチはありますか?
答え1
満足のいく解決策が見つかりました。
udevから直接マウントする代わりに、提案されているように新しいサービスを作成しました。この問題。最後に私はこのudevルールを得ました:
ACTION=="add",<Your device specifiers here>,ENV{SYSTEMD_WANTS}="log@$env{DEVPATH}.service"
次のサービスが追加されました/etc/systemd/system
。
[Service]
Type=oneshot
TimeoutStartSec=300
GuessMainPID=false
RemainAfterExit=yes
ExecStart=/bin/bash -c "/home/user/mount.sh %I"
私のスクリプトを次のように修正しました。
#!/bin/sh
LOGFILE="/home/user/mount.log"
MOUNTDIRECTORY="/media/mount_point"
DEVPATH=$1
BASENAME="$(basename $DEVPATH)"
DEVICE="/dev/$BASENAME"
if [ -z "$BASENAME" ]; then
exit
fi
echo "" >> $LOGFILE
echo "New USB device detected at $DEVICE" >> $LOGFILE
if grep '$MOUNTDIRECTORY ' /proc/mounts; then
# Already mounted
echo "Mount directory already in use" >> $LOGFILE
exit
fi
mount $DEVICE $MOUNTDIRECTORY -o umask=0000,gid=1000,uid=1000 >> $LOGFILE
if [ $? -eq 0 ]; then
echo "$DEVICE mounted at $MOUNTDIRECTORY" >> $LOGFILE
if [ -f $MOUNTDIRECTORY/log.ini ]; then
echo "Log.ini found. Ready to log" >> $LOGFILE
break
elif [ -z "$(ls -A $MOUNTDIRECTORY)" ]; then
echo "USB device empty. Creating log.ini" >> $LOGFILE
touch $MOUNTDIRECTORY/log.ini
break
else
echo "Log.ini not found. Unmounting" >> $LOGFILE
umount $MOUNTDIRECTORY
fi
else
echo "Failed to mount $DEVICE at $MOUNTDIRECTORY" >> $LOGFILE
fi
echo "" >> $LOGFILE
元の問題の原因はまだ理解されていません(log.iniファイルがマウントされているデバイスの1つではなくマウントポイントに表示されます)。誰でも説明があれば興味があるでしょう。