![隠しファイルですか? (おそらく間違ったスクリプトです)](https://rvso.com/image/122419/%E9%9A%A0%E3%81%97%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E3%81%99%E3%81%8B%3F%20(%E3%81%8A%E3%81%9D%E3%82%89%E3%81%8F%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E3%81%99).png)
私は、Debian Jessie 上の Beaglebone Black に新しい SD カードを挿入すると Udev によって実行されるスクリプトを作成中です。
スクリプトで最初に実行したいのは、/media/sdcard
ディレクトリを作成することです。簡単なはずですが、何らかの理由で機能しません...
私が書いたスクリプトは次のとおりです。
#!/bin/bash -xe
#This script creates the /media/sdcard folder in order to mount the sdcard in it
#Error codes:
# - 2 : /media/sdcard already exist but is not a directory
# - 1 : Failed to create /media/sdcard/
logger -t SDCardscripts 'Entering /root/ServolineScripts/PrepareSDCard.sh script'
if [ -d /media/sdcard ]; then
logger '/media/sdcard is already present. Deleting it.' && rm -rf /media/sdcard;
elif [ -f /media/sdcard ]; then
logger -t SDCardscripts 'A file /media/sdcard already exist! Stopping process, Please look in the /media directory and take a decision with it content'
exit 2
else
logger -t SDCardscripts '/media/sdcard does not exist creating a new one'
fi
mkdir -p /media/sdcard
if [ $? -eq 0 ];then
logger -t SDCardscripts '/media/sdcard directory successfully created';
else
logger -t SDCardscripts 'Failed to create /media/sdcard directory'
exit 1;
fi
logger -t SDCardscripts 'Leaving /root/ServolineScripts/PrepareSDCard.sh script'
SD カードを挿入したときに生成されるログ ラインは次のとおりです。
Nov 24 14:06:34 undefined kernel: [ 5546.379851] mmc0: host does not support reading read-only switch, assuming write-enable
Nov 24 14:06:34 undefined kernel: [ 5546.383558] mmc0: new high speed SDHC card at address 0007
Nov 24 14:06:34 undefined kernel: [ 5546.401181] mmcblk0: mmc0:0007 SD08G 7.42 GiB
Nov 24 14:06:34 undefined rsyslogd-2007: action 'action 17' suspended, next retry is Fri Nov 24 14:07:04 2017 [try http://www.rsyslog.com/e/2007 ]
Nov 24 14:06:34 undefined kernel: [ 5546.413258] mmcblk0: p1
Nov 24 14:06:34 undefined SDCardscripts: Entering /root/ServolineScripts/PrepareSDCard.sh script
Nov 24 14:06:35 undefined logger: /media/sdcard is already present. Deleting it.
Nov 24 14:06:35 undefined systemd-udevd[2003]: Process '/root/ServolineScripts/PrepareSDCard.sh' failed with exit code 1.
Nov 24 14:06:35 undefined systemd-udevd[2003]: Process '/bin/mount /dev/%K /media/sdcard' failed with exit code 32.
私が理解しているのは次の通りです:
- Udev スクリプトに入力 OK
- Udev はファイルが存在するかどうか正常に確認しました
- Udev が mkdir の実行に失敗する
このスクリプトを実行した後、次のことを試しました:
root@undefined:~/ServolineScripts# cd /media
root@undefined:/media# ls -l
total 0
ノーコメント...
最後に、/media/sdcard がすでに存在するかどうかを確認する行 (最初の if と elif すべて) を削除しようとしましたが、この場合、プロセスは mkdir 実行で失敗します。
この症状は、µSdcard を差し込んだときに発生しますが、と入力してスクリプトを実行するとbash -xe /root/ServolineScripts/PrepareSDCard
、次のようになります。
+ logger -t SDCardscripts 'Entering /root/ServolineScripts/PrepareSDCard.sh script'
+ '[' -d /media/sdcard ']'
+ logger '/media/sdcard is already present. Deleting it.'
+ rm -rf /media/sdcard
+ mkdir -p /media/sdcard
+ '[' 0 -eq 0 ']'
+ logger -t SDCardscripts '/media/sdcard directory successfully created'
+ logger -t SDCardscripts 'Leaving /root/ServolineScripts/PrepareSDCard.sh script'
(そして明らかに、mkdir の実行は成功し、/media/sdcard/ が作成されました...)
* 問題がどこにあるのか、またはデバッグに役立つ情報があれば教えてください。*
(4 日間使用しています...新しいイメージでビーグルを復元しようとしました... :-( )
PS: 私が書いた別の戻り値は適切なコマンドではないことはすでにわかりました... 値を返すときにスクリプトを中断する方法がわかっているなら、それを利用します! ただし、これは 2 番目の主題です...
答え1
有効にしているため、エラーを受信するとすぐにスクリプトが終了しますbash -e
。
失敗しているコマンドは ですrm -rf
。スクリプトの実行時点では にファイルシステムがマウントされているためです/media/sdcard
。
例
# Prepare disk as image
dd if=/dev/zero bs=1M count=100 >100M.img
lo=$(losetup --find --show 100M.img | tee /dev/stderr)
fdisk $lo <<X
n
p
1
w
X
losetup -d $lo
lo=$(losetup --find --show --partscan 100M.img | tee /dev/stderr)
# Create and mount new filesystem
mkfs -t ext4 ${lo}p1
mkdir -p /mnt/dsk
mount ${lo}p1 /mnt/dsk
# Demonstrate trying to remove the directory tree (and failing)
rm -rf /mnt/dsk
echo SS=$?
# All done
umount /mnt/dsk
losetup -d $lo
rm 100M.img