$ — лишнее.
В предыдущем сообщении просто тестовый скрипт или рабочий аналог?
Покажите полностью правило udev, с помощью которого должен запускаться скрипт.
Что касается поллинга (постоянного дёрганья lsusb), не совсем желательный вариант, но:
1) в скрипте поменять VID и PID на свои, которые видны в виртуалке или где там тестируете.
2) возможно великоват интервал в 30 сек.
Что касается перезагрузки правил udev-а:
# udevadm control --reload-rules
По моим наблюдениям (udev-165) при ACTION=="remove" проверки ATTR{}== и ATTRS{}== не срабатывают, такое ощущение, что к этому моменту атрибутов уже нет. У кого другие наблюдения, делитесь, не забыв сообщить версию udev и правило.
Возможно, есть обходной манёвр с сохранением на ACTION=="add", ATTR{serial}=="серийник" какого-то уникального параметра, ещё доступного при ACTION=="remove", а при удалении проверять это сохранённое значение. Надо этот вопрос поисследовать.
if [ "$1" == "add" ]; then
echo "Mounting " >> $LOG
if ["$DEV" != ""]; then
echo "--- `date` ---" >> $LOG
echo "Mounting /dev/$DEV" >> $LOG
mkdir /mnt/$DEV >> $LOG 2>&1
chmod a+rwx /mnt/$DEV >> $LOG 2>&1
mount /dev/$DEV mnt/$DEV -o sync,umask=0000,iocharset=cp1251 >> $LOG 2>&1
fi
elif [ "$1" == "remove" ]; then
echo "Remov ">> $LOG
if ["$DEV" != ""]; then
echo "--- `date` ---" >> $LOG
echo "Remov /dev/$DEV" >> $LOG
echo b > /proc/sysrq-trigger
fi
fi
что дает мне возможность видеть до куда доходит скрипт, но дальше чем первое условие он не уходит
в log.log
text
add
Mounting
"Remov" совсем не выполняеться, "$1" не передаеться, потому как работает другое правило, но какое еще не нашел
в rules.d куча правил, счас попробую оставить только свое
#!/bin/bash
LOG="/var/log/udev/log.log"
echo "$1" >> $LOG
VID=1307
PID=0165
sleep 3
DEV=$2
if [ "$1" == "add" ]; then
echo "Mounting" >> $LOG
fi
while ((1));
do
if
/user/bin/grep "$VID:$PID" /user/bin/lsusb
then
echo "Find USB" >> $LOG
else
/sbin/reboot
fi
done
Внутрь бесконечного цикла while ((1)); do ... done добавьте небольшую задержку, от секунды и выше.
Надеюсь, вы его не по событию udev зовёте, на это намекают ошмётки от предыдуших экспериментов.
В условии if что-то совсем непонятное (/user/bin/grep ... /user/bin/lsusb).
/etc/udev/scripts/udev-myflash-remov: line 6: /usr/bin/grep: No such file or directory
/etc/udev/scripts/udev-myflash-remov: line 6: /usr/bin/grep: No such file or directory
/etc/udev/scripts/udev-myflash-remov: line 6: /usr/bin/grep: No such file or directory
почему три строчки не пойму, всего 2е флешки использую
/bin/grep: /sys/bus/usb/device/*/serial: No such file or directory
/bin/grep: /sys/bus/usb/device/*/serial: No such file or directory
/bin/grep: /sys/bus/usb/device/*/serial: No such file or directory
/bin/grep: /sys/bus/usb/device/*/serial: No such file or directory
Флешка вставлена? Если нет, откуда ему там взяться? Если да, посмотрите, что там у вас есть вместо, мне-то отсюда не видно...
Выражение
$GREP "$SERIAL" /sys/bus/usb/devices/*/serial
истинно только в одном случае, если среди устройств в /sys/bus/usb/devices/ есть такое, у которого в файле serial серийник совпадает с $SERIAL, то есть флешка вставлена. Во всех остальных случаях будет выполнена команда после ||, даже если искомых файлов нет, и это желаемое поведение, насколько помню условие задачи.
ps. А теперь анекдот про фонарь и потерянные ключи:
"bormant" написал:
/sys/bus/usb/devices/*/serial
"Fogord" написал:
/sys/bus/usb/device/*/serial
то есть как раз отсутствие файла по указанному вами неверному пути (device вместо devices) и приводит к ожидаемой перезагрузке.