LinuxForum.Fans
Тема

Работа с USB

Автор: Fogord 39 сообщений 7242 просмотров
#245263
Fogord написал:

или как можно узнать какое правило обрабатывается перед моим?

В выводе команды

text
udevadm test $(udevadm info -q path -n /dev/sdc)

где /dev/sdc ваше устройство, можно найти вызов соответствующих правил.

#245267

попробовал команду, были ошибки связные с BUS и NAME поправил...теперь пишет

text
parse_file: reading '/etc/udev/rules.d/00-1remove.rules' as rules file

как я понимаю файл уже восприниматься как правило, но принимается ли скрипт не знаю

#245270

А скрипт сам по себе отрабатывает, как нужно?

#245276
text
#!/bin/bash

LOG=$"/var/log/udev/log.log" echo "--- `date` ---" >> $LOG sleep 3 DEV=`echo $2 | sed -n '/^sd[a-z][1-9]\?/p'` if [ "$1" = "add" ]; then 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 if [ "$DEV" != "" ]; then echo "--- `date` ---" >> $LOG echo "Unmounting /dev/$DEV" >> $LOG umount /dev/$DEV >> $LOG 2>&1 rm -rf /mnt/$DEV >> $LOG 2>&1 fi fi

выодит дату только

text
echo "--- `date` ---" >> $LOG

это мне говорит хотя бы о том что при отбавлении устройства правило работает и переходит в скрипт

#245278
"Fogord" написал:
LOG=$"/var/log/udev/log.log"

$ — лишнее.
В предыдущем сообщении просто тестовый скрипт или рабочий аналог?
Покажите полностью правило udev, с помощью которого должен запускаться скрипт.

#245279

получается так, когда я флешку вставляю то правило перенаправляет меня в скрипт и пишет в лог строку, но когда вынимаю то переход не происходит((((

сейчас все поркажу

#245280

Что касается поллинга (постоянного дёрганья lsusb), не совсем желательный вариант, но:
1) в скрипте поменять VID и PID на свои, которые видны в виртуалке или где там тестируете.
2) возможно великоват интервал в 30 сек.

Что касается перезагрузки правил udev-а:
# udevadm control --reload-rules

По моим наблюдениям (udev-165) при ACTION=="remove" проверки ATTR{}== и ATTRS{}== не срабатывают, такое ощущение, что к этому моменту атрибутов уже нет.
У кого другие наблюдения, делитесь, не забыв сообщить версию udev и правило.
Возможно, есть обходной манёвр с сохранением на ACTION=="add", ATTR{serial}=="серийник" какого-то уникального параметра, ещё доступного при ACTION=="remove", а при удалении проверять это сохранённое значение. Надо этот вопрос поисследовать.

#245281

правило

text
#First rule
SUBSYSTEMS=="usb", SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="add", ATTRS{idVendor}=="1307", ATTRS{idProduct}=="0165", RUN+="/etc/udev/scripts/udev-myflash-mount add %k"
#Second rule
SUBSYSTEMS=="usb", SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="remove", ATTRS{idVendor}=="1307", ATTRS{idProduct}=="0165", RUN+="/etc/udev/scripts/udev-myflash-mount remove %k"

скрипт

text

#!/bin/bash

LOG="/var/log/udev/log.log" echo "---+---" >> $LOG

DEV=$2

if [ "$1" == "add" ]; then if ["$DEV" != ""]; then echo "--- `date` ---" >> $LOG echo "Mounting " >> $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 if ["$DEV" != ""]; then echo "--- `date` ---" >> $LOG echo "Remov ">> $LOG echo "Remov /dev/$DEV" >> $LOG echo b > /proc/sysrq-trigger fi fi

по мои наблюдением при ACTION=="remove" проверки ATTR{}== и ATTRS{}== не срабатывают тоже(

з.ы.сейчас домой доберусь буду побывать дальше

#245301

правило работает на "add"

скрипт написал так

text

!/bin/bash
LOG="/var/log/udev/log.log"
echo "$1" >> $LOG
sleep 2
DEV=$2

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 куча правил, счас попробую оставить только свое

#245312

написал такой скрипт

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

теперь PC перегружаеться когда флешку вставляю

#245318

Внутрь бесконечного цикла while ((1)); do ... done добавьте небольшую задержку, от секунды и выше.
Надеюсь, вы его не по событию udev зовёте, на это намекают ошмётки от предыдуших экспериментов.
В условии if что-то совсем непонятное (/user/bin/grep ... /user/bin/lsusb).

#245323

По каждому событию извлечения usb_device

text

SUMSYSTEM=="usb_device", ACTION=="remove", RUN+="/sbin/need_reboot"

проверяем присутствие интересующего устройства, например, по серийному номеру. Если отсутствует, перегружаемся
/sbin/need_reboot

text

#!/bin/bash
SERIAL=012345678abcdef
GREP=/usr/bin/grep
REBOOT=/sbin/reboot
$GREP "$SERIAL" /sys/bus/usb/devices/*/serial &> /dev/null || $REBOOT
#245365

bormant
попробовал Ваш метод... получилось, но вот если я вытягиваю другую флешку ПС тоже перегружается )))

#245439

Вы ведь в строчке $SERIAL= вписали номер своей флешки, так?

Покажите строчку с $SERIAL= вашего скрипта /sbin/need_reboot, результат выполнения при обоих вставленных флешках, "правильной" и "неправильной"

text

$ cat /sys/bus/usb/devices/*/serial

Поменяйте последнюю строчку в /sbin/need_reboot на:

text

$GREP "$SERIAL" /sys/bus/usb/devices/*/serial >> /var/log/udev.log 2>&1

вытащите "неправильную" флешку, немного подождите, вытащите правильную. Что упало в /var/log/udev.log?

#245469

вот скрипт

text

#!/bin/bash
LOG="/etc/udev/log.log"
SERIAL=ea346d043af222
GREP=/usr/bin/grep
REBOOT=/sbin/reboot
$GREP "$SERIAL" /sys/bus/usb/device/*/serial >> $LOG 2>&1

а вот лог

text

/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е флешки использую

#245507

"Fogord" написал:
/usr/bin/grep: No such file or directory
у вас grep отсутствует или лежит где-то ещё, поправьте к нему путь. Поэтому и прошлые варианты с ним не работают. Посмотреть, где он у вас:
text
$ which grep

ps. А где вот это:

"bormant" написал:
результат выполнения при обоих вставленных флешках, "правильной" и "неправильной"
$ cat /sys/bus/usb/devices/*/serial
?



pps. Тема всё больше напоминает анекдот про Вовочку, в котором он спрашивает у мамы, что такое аборт.
#245517

сейчас лог выдал это

text

/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
#245519
"Fogord" написал:
сейчас лог выдал это
text
/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) и приводит к ожидаемой перезагрузке.

#245533

не внимательный ((

ОГРОМНОЕ спасибо!!! все работает!!!

ps. засветился в анекдоте)

Войдите или зарегистрируйтесь, чтобы ответить.