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