web-dev-qa-db-ja.com

隠しファイル? (おそらく間違ったスクリプト)

私は、DebianJessieの下のBeagleboneBlackに新しい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カードを差し込んだときに生成されるlogg行は次のとおりです。

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日経ちました...新しい画像でビーグルを復元しようとしました... :-()

追伸:私が書いた別の戻り値は良いコマンドではないことをすでに見ました...値を返しながらスクリプトを壊す方法を知っているなら、私はそれを取ります!しかし、これは2番目の主題です...

3
JeromeLEKIEFFRE

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
2
roaima