![Скрытый файл? (скорее всего, неправильный скрипт)](https://rvso.com/image/122419/%D0%A1%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%B9%20%D1%84%D0%B0%D0%B9%D0%BB%3F%20(%D1%81%D0%BA%D0%BE%D1%80%D0%B5%D0%B5%20%D0%B2%D1%81%D0%B5%D0%B3%D0%BE%2C%20%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82).png)
Я работаю над скриптом, который будет выполняться Udev при установке новой SD-карты на моем Beaglebone Black под управлением Debian Jessie.
Первое, что я хотел бы, чтобы мой скрипт сделал, это создал каталог /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 вошел в мой скрипт ОК
- 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: Я уже видел, что другой return, который я написал, не является хорошей командой... если вы знаете, как прервать скрипт при возврате значения, я это приму! Но это уже вторая тема...
решение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