Как запустить пользовательские сценарии на подключаемом USB-устройстве?
41
Каков современный метод автоматического выполнения пользовательских сценариев на подключаемом модуле USB-устройства в современных дистрибутивах Linux, таких как Debian / CentOS / Fedora?
Например, если вы хотите автоматически смонтировать / скопировать некоторые файлы / размонтировать запоминающее устройство USB на основе его UUID (или идентификатора устройства и т. Д.).
Добавьте предложение, например, NAME="subdir/mydisk%n"если вы хотите использовать пользовательский путь ввода в /dev.
Запустите, udevadm info -a -n sdbчтобы увидеть, с какими атрибутами вы можете сопоставить ( attribute=="value"; замените sdbна имя устройства, автоматически назначаемое диску, соответствующее новой записи, созданной /devпри его подключении). Обратите внимание , что вы можете использовать ATTRSпункты из любой одной строфы: вы можете выбрать любую строфу, но ATTRSпункты должны все из той же строфы, вы не можете смешивать и сочетать. Вы можете смешивать ATTRSпредложения с другими типами предложений, перечисленных в другом разделе.
Этот ответ остается в силе? Ни при каких обстоятельствах я не могу заставить скрипт выполнить (и коснуться файла). Если вы можете предоставить самый простой пример, который выполняет скрипт, когда что-то подключено, это было бы здорово, и мы можем работать оттуда.
Redsandro
@Redsandro У меня есть варианты этого правила в моей конфигурации udev, и они работают. Вы подключили устройство и снова включили или запустили udevadm trigger? Ваша система использует udev? Если вы хотите запустить скрипт, когда что-то подключено, удалите все условия (пункты с ==) (возможно, синтаксис требует одно условие, я не уверен; если это так, используйте KERNEL=="*").
Жиль "ТАК - прекрати быть злым"
Я тоже это пробовал, но так как это работает для вас, я, должно быть, пропускаю шаг. Я перенес этот вопрос сюда , чтобы я мог написать пример кода.
Redsandro
Возможно, связано, я думаю, есть ограничение по времени, сколько может длиться скрипт. Я считаю, что это очень короткий (например, 1 секунда или что-то). Если это займет больше времени, то Udev убьет его. Вы можете обойти это, используя фоновый сценарий с чем-то вроде at. См. «Запуск внешних программ» на веб-сайте
activactive.net/writing_udev_rules.html
Просто добавить к этому, для полноты картины , потребность файла , чтобы иметь суффикс .rulesи файлы в каталоге считываются в лексикографическом порядке (Конвенция использует числовой префикс для того их), и они могут быть ниже /etc/, /usr/libили /run. Для более RTFM .
Звездный путь
14
Я искал /lib/udev/rules.dпримеры связанных с диском правил. В системе Ubuntu один файл правил предоставляет переменную среды, ID_FS_UUID_ENCкоторую вы можете использовать в собственных файлах правил.
Таким образом, я поместил файл пользовательских правил в /etc/udev/rules.d/foodevice.rules. Поскольку перед номером нет префикса, он наконец запускается udev. Кстати, демон udev следил /etc/udev/rules.dза изменениями, так что вам не нужно перезапускать его при изменении файла.
(это одно правило - вы должны удалить символ новой строки после предложения ENV, потому что у udev нет механизма продолжения строки)
Программа, запущенная udev, блокирует демона, поэтому она не должна работать долгое время. Я решил это через at- то есть путем отсоединения от процесса, выполняющего реальную работу:
$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
Вам может потребоваться перезагрузить правила udev udevadm control --reload-rules, в зависимости от вашего дистрибутива.
user44038
1
Вместо того, чтобы at nowя предлагаю batch.
Восстановить Монику - М. Шредер
Что делать, когда у тебя нет ни того, atни другого batch? Я нахожусь во встроенной среде с busybox .
natenho
@natenho, вы можете использовать ~/path/mountcopystuff.sh &- atи т.д. имеет то преимущество, что вы получаете уведомления по электронной почте на случай, если что-то пойдет не так, - но во встроенной системе это, вероятно, не представляет большого интереса.
udevadm trigger
? Ваша система использует udev? Если вы хотите запустить скрипт, когда что-то подключено, удалите все условия (пункты с==
) (возможно, синтаксис требует одно условие, я не уверен; если это так, используйтеKERNEL=="*"
).at
. См. «Запуск внешних программ» на веб-сайте.rules
и файлы в каталоге считываются в лексикографическом порядке (Конвенция использует числовой префикс для того их), и они могут быть ниже/etc/
,/usr/lib
или/run
. Для более RTFM .Я искал
/lib/udev/rules.d
примеры связанных с диском правил. В системе Ubuntu один файл правил предоставляет переменную среды,ID_FS_UUID_ENC
которую вы можете использовать в собственных файлах правил.Таким образом, я поместил файл пользовательских правил в
/etc/udev/rules.d/foodevice.rules
. Поскольку перед номером нет префикса, он наконец запускается udev. Кстати, демон udev следил/etc/udev/rules.d
за изменениями, так что вам не нужно перезапускать его при изменении файла.Содержание
/etc/udev/rules.d/foodevice.rules
это:(это одно правило - вы должны удалить символ новой строки после предложения ENV, потому что у udev нет механизма продолжения строки)
Программа, запущенная udev, блокирует демона, поэтому она не должна работать долгое время. Я решил это через
at
- то есть путем отсоединения от процесса, выполняющего реальную работу:источник
udevadm control --reload-rules
, в зависимости от вашего дистрибутива.at now
я предлагаюbatch
.at
ни другогоbatch
? Я нахожусь во встроенной среде с busybox .~/path/mountcopystuff.sh &
-at
и т.д. имеет то преимущество, что вы получаете уведомления по электронной почте на случай, если что-то пойдет не так, - но во встроенной системе это, вероятно, не представляет большого интереса.