udev afeta o comportamento do script, evita que o dpkg funcione

2

Eu tenho uma regra do udev configurada para executar um script de shell sempre que uma unidade flash USB é inserida; Eu verifiquei que o udev corresponde à regra, que o shell script é executado como planejado quando executado manualmente com o parâmetro correto e que o script está sendo executado; monta com sucesso a unidade e chega ao ponto em que o dpkg deve ser executado, mas nada está realmente instalado.

Também frustrando meus esforços é que eu tenho tanto o dpkg quanto o próprio script configurado para redirecionar sua saída para arquivos temporários para que eu possa depurá-lo; no entanto, enquanto ambos exibem sua saída perfeitamente quando executados manualmente, eles produzem arquivos completamente vazios quando são disparados pelo udev, então nem consigo ver qual erro o dpkg pode estar produzindo, se estiver criando um. Ouvi dizer que o udev não roda coisas com um terminal, mas não sei se é o caso ou se isso causaria isso.

regra do udev:

SUBSYSTEMS=="usb", KERNEL=="sd?1", RUN+="/usr/local/sbin/updater-runner.sh %"

Script sendo executado diretamente pelo udev:

#!/bin/sh

/usr/local/sbin/updater.sh ${1} & > /tmp/updater.out'

Roteiro principal:

#!/bin/sh

DEVICE=$1
echo "Running..."
echo $DEVICE
# check input
if [ -z "$DEVICE" ]; then
    exit 1
fi

# test that the device isn't already mounted
device_is_mounted='grep ${DEVICE} /etc/mtab'
if [ -n "$device_is_mounted" ]; then
    echo "error: seems /dev/${DEVICE} is already mounted"
fi

# pull in useful variables from vol_id, quote everything Just In Case
# eval 'blkid /dev/${DEVICE} -o value | sed 's/^/export /; s/=/="/; s/$/"/''

ID_FS_LABEL=$(blkid /dev/${DEVICE} -o value | head -n 1)
export ID_FS_LABEL
ID_FS_TYPE=$(blkid /dev/${DEVICE} -o value | tail -n 1)
export ID_FS_TYPE
echo $ID_FS_LABEL
echo $ID_FS_TYPE
if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
    echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
    exit 1
fi

# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then
    # make the mountpoint
    mkdir "/media/${ID_FS_LABEL}"

    # mount the device

    case "$ID_FS_TYPE" in

        vfat) mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
            ;;

        ntfs) mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
            ;;

        ext*) mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
            ;;
    esac

    #check if file exists

    #run dpkg
    if [ -f "/media/${ID_FS_LABEL}/ACS.deb" ]; then
        echo "Killing ACS..."
        killall ACS
        echo "Running dpkg..."
        yes | dpkg --force-architecture --force-depends -i "/media/${ID_FS_LABEL}/ACS.deb" > /tmp/dpkg.out
        echo "Restarting ACS..."
        nohup ACS &> /dev/null &
    fi
fi

exit 0
    
por Max Gene 27.03.2013 / 18:08

1 resposta

0

Não tenho certeza sobre o restante, mas o motivo pelo qual você está recebendo arquivos vazios é que você tem um erro de sintaxe no script:

#!/bin/sh

/usr/local/sbin/updater.sh ${1} & > /tmp/updater.out'

deve ser (você também deve capturar STDERR):

#!/bin/sh

/usr/local/sbin/updater.sh ${1} > /tmp/updater.out 2>/tmp/updater.error &

Do jeito que você tem, o script é colocado em segundo plano antes de qualquer saída gerada e você obtém arquivos vazios. Além disso, eu assumo o 'no final da linha é um erro de digitação certo?

Quanto ao resto, qual usuário está sendo executado como? Eu não sei o suficiente sobre o udev para adivinhar. Quem executa o script tem os direitos para executar dpkg ?

    
por 27.03.2013 / 19:35