Um arquivo oculto? (provavelmente um script errado)

Um arquivo oculto? (provavelmente um script errado)

Estou trabalhando em um script executado pelo Udev na inserção de um novo sdcard no meu Beaglebone Black no Debian Jessie.

A primeira coisa que gostaria que meu script fizesse é criar o /media/sdcarddiretório. Deveria ser fácil, mas por alguma razão obscura não está funcionando...

Aqui está o script que escrevi:

#!/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'

Aqui estão as linhas de registro geradas quando conecto um cartão 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.

Então o que eu entendo é:

  • Udev entre no meu script OK
  • Udev verificou com sucesso se existe um arquivo
  • Udev falha ao executar mkdir

Depois de executar este script, tentei:

root@undefined:~/ServolineScripts# cd /media
root@undefined:/media# ls -l
total 0

Sem comentários...

Por fim, tentei deletar as linhas para verificar se /media/sdcard já existe (todos os primeiros if e elif) e neste caso o processo falha na execução do mkdir.

Esses sintomas ocorrem quando eu plugo o µSdcard, mas se eu executar o script digitando bash -xe /root/ServolineScripts/PrepareSDCard, aqui está o que obtive:

+ 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'

(E obviamente conseguiu executar mkdir e o /media/sdcard/ foi criado ...)

* Se você tiver alguma idéia de onde está o problema... ou qualquer coisa que possa me ajudar a depurar isso...*

(já faz 4 dias que estou nisso... até tentei restaurar o Beagle com uma nova imagem... :-()

PS: Já vi que os diferentes retornos que escrevi não são um bom comando... se você sabe quebrar um script enquanto retorna um valor eu aceito! mas esse é um segundo assunto...

Responder1

Seu script é encerrado assim que recebe um erro porque você o bash -eativou.

O comando com falha é rm -rfporque no momento em que seu script está sendo executado, há um sistema de arquivos montado em /media/sdcard.

Exemplo

# 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

informação relacionada