udev wpływa na zachowanie skryptu, zapobiega działaniu dpkg

2

Mam regułę udev skonfigurowaną do uruchamiania skryptu powłoki po każdym włożeniu dysku flash USB; Sprawdziłem, czy udev jest zgodny z regułą, że skrypt powłoki działa zgodnie z przeznaczeniem, gdy jest uruchamiany ręcznie z poprawnym parametrem i że skrypt jest uruchamiany; z powodzeniem montuje dysk i dochodzi do punktu, w którym należy uruchomić dpkg, ale tak naprawdę nic nie jest zainstalowane.

Frustrujące są też moje wysiłki polegające na tym, że mam zarówno dpkg, jak i sam skrypt, aby przekierowywać swoje dane wyjściowe do plików tymczasowych, aby móc to debugować; jednak, mimo że oba wyświetlają swoje wyniki idealnie podczas ręcznego uruchamiania, generują całkowicie puste pliki po uruchomieniu przez udev, więc nawet nie widzę, jaki błąd może powodować dpkg, jeśli w ogóle go powoduje. Słyszałem, że udev nie działa z terminalem, ale nie wiem, czy tak jest, czy to by to spowodowało.

zasada udev:

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

Skrypt uruchamiany bezpośrednio przez udev:

#!/bin/sh

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

Główny skrypt:

#!/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
tacoman
źródło

Odpowiedzi:

0

Nie jestem pewien co do reszty, ale przyczyną otrzymywania pustych plików jest błąd składniowy w skrypcie:

#!/bin/sh

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

powinno być (należy również przechwycić STDERR):

#!/bin/sh

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

Tak, jak masz, skrypt jest umieszczany w tle, zanim zostanie wygenerowane jakiekolwiek wyjście i otrzymasz puste pliki. Zakładam też, że „na końcu linii jest literówka, prawda?

Co do reszty, jakim użytkownikiem jest ten użytkownik? Nie wiem wystarczająco dużo o udev, żeby zgadywać. Czy ktokolwiek skrypt jest uruchamiany, ponieważ ma prawa do jego wykonania dpkg?

terdon
źródło
o ile wiem, udev uruchamia wszystko jako root; na przykład działa mount. A tylda to literówka, nie wiem, jak się tam dostała.
tacoman
@MaxGene tak Wyobraziłem sobie, że tak, ale pomyślałem, że zapytam na wypadek, gdyby działał jak jakiś inny uprzywilejowany użytkownik. Głównym błędem nie był `, ale &. Jeśli zmienisz to na to, co zasugerowałem, powinieneś przynajmniej otrzymać jakieś informacyjne komunikaty o błędach i mieć możliwość debugowania.
terdon
@ MaxGene zastrzelony tutaj w ciemności, ale jeśli montujesz napęd VFAT, możesz nie wchodzić w ifpętlę, ponieważ VFAT nie rozróżnia wielkości liter. Nie jestem pewien, czy / jak to na ciebie wpłynie, ale ponieważ podajesz konkretną nazwę pliku, może to stanowić problem. Spróbuj zmienić na if [-fcoś w styluif [ $(find /media/${ID_FS_LABEL}/ -iname ACS.deb) ]
terdon
W rzeczywistości działa teraz idealnie; Nie mogę jeszcze opublikować odpowiedzi na moje pytanie, aby uzupełnić twoje pytanie, ale drugim problemem (jak odkryłem po naprawieniu przekierowania wyjścia) było to, że udev w jakiś sposób sabotuje PATH, co powoduje balking dpkg; działało ustawienie i eksportowanie własnej ścieżki ze skryptu.
tacoman
@ MaxGene Ah, miło. Możesz i rzeczywiście powinieneś opublikować odpowiedź na swoje pytanie. Które są aktywnie zachęcani na stronach SE. Polecam nie zaakceptować mojej odpowiedzi, głosuj za nią, ponieważ pomogła ci, a następnie opublikuj odpowiedź wyjaśniającą, w jaki sposób ją naprawiłeś, i zaakceptuj ją.
terdon