2

У меня настроено правило udev для запуска сценария оболочки всякий раз, когда вставляется флешка; Я проверил, что udev соответствует правилу, что сценарий оболочки запускается так, как задумано, при запуске вручную с правильным параметром, и что сценарий выполняется; он успешно монтирует диск и попадает в точку, где должен быть запущен dpkg, но на самом деле ничего не установлено.

Кроме того, мои усилия расстраивают то, что у меня есть и dpkg, и сам скрипт, настроенный для перенаправления их вывода во временные файлы, чтобы я мог отладить это; однако, хотя оба выводят свои выходные данные отлично при запуске вручную, они генерируют совершенно пустые файлы при запуске udev, поэтому я даже не вижу, какую ошибку может вызвать dpkg, если она вообще возникает. Я слышал, что udev не работает с терминалом, но я не знаю, так ли это или это вызвало бы это.

Правило Удев:

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

Скрипт, запускаемый непосредственно udev:

#!/bin/sh

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

Основной скрипт:

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

1 ответ1

0

Не уверен насчет остального, но причина, по которой вы получаете пустые файлы, заключается в том, что в вашем скрипте есть синтаксическая ошибка:

#!/bin/sh

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

должно быть (вы также должны захватить STDERR):

#!/bin/sh

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

Таким образом, сценарий помещается в фоновый режим, прежде чем генерируется какой-либо вывод, и вы получаете пустые файлы. Кроме того, я предполагаю, что `в конце строки является опечаткой, верно?

В остальном, каким пользователем это запускается? Я не знаю достаточно о Udev, чтобы догадаться. Имеет ли тот, кто запускает скрипт, права на выполнение dpkg?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .