Как запустить пользовательские скрипты на плагин USB-устройства?

Как обычно: ответ зависит. RPMs (или в основном любой данный двоичный контейнер пакета) содержат выполнимый код. Большую часть времени тот код зависит от определенных библиотек или программ, пакет указывает, что действительно, например, зависит от библиотеки libA в версии> = 1.0.

Теперь возьмите два различных дистрибутива с обоими использованиями об/мин упаковочный формат. скажем, каждый называет пакет libA-1.0 так об/мин, которого Вы имеете, указывает, что он зависит от libA. Второе двоичное распределение имеет другую naimg схему и префиксы пакет с a language таким образом, это называют language-libA. Даже если содержание обоих этих libA пакетов идентично, диспетчер пакетов не может знать это. Вы могли, конечно, вынудить об/мин просто установить пакет так или иначе, не смотря на зависимости, но это обычно просто просит наказание.

Проблема менее плоха, если оба дистрибутива связаны или даже основанные друг на друге: Ubuntu, например, основана на debian и поэтому совместно использует многие соглашения о присвоении имен и пакеты, таким образом, Вы можете othen передавать сборку пакета для debian к полю Ubuntu.

Это также во многом зависит, на каком языке пакет записан в: Если Вам интерпретировали что-то как Python, где пакет является в основном просто набором текстовых файлов, берущих пакет для другого распределения, обычно легко обработать, но если это записано в C++ и зависит, и оба дистрибутива используют различные версии оперативных библиотек или компиляторов, Вам в основном не повезло.

42
07.01.2012, 23:26
2 ответа

Поместите строку как это в файле в /etc/udev/rules.d:

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"

Добавьте пункт как NAME="subdir/mydisk%n" если Вы хотите использовать пользовательский путь записи под /dev.

Выполненный udevadm info -a -n sdb видеть, что приписывает Вас, может соответствовать против (attribute=="value"; замена sdb именем устройства, автоматически присвоенным диску, соответствуя новой записи, созданной в /dev когда Вы включаете его). Обратите внимание, что можно использовать ATTRS пункты из любой строки файла конфигурации: можно выбрать любую строку файла конфигурации, но ATTRS пункты должны все прибыть из той же строки файла конфигурации, Вы не можете смешивание и подгонка. Можно смешаться ATTRS пункты с другими типами пунктов перечислены в другой строке файла конфигурации.

27
27.01.2020, 19:35
  • 1
    Этот ответ все еще действителен? Ни под каким объемом игры может я заставлять сценарий выполнять (и касаться файла). Если можно обеспечить самый основной пример, который выполняет сценарий, когда что-либо включается, который был бы большим, и мы можем работать оттуда. –  Redsandro 22.02.2013, 17:00
  • 2
    @Redsandro у меня есть изменения этого правила в моей udev конфигурации и они работают. Вы включали устройство и въезжали задним ходом или работали udevadm trigger? Ваша система использует udev? Если Вы хотите запустить скрипт, когда что-либо включается, удалите все условия (пункты с ==) (возможно, синтаксис требует одного условия, я не уверен; если это делает, использовать KERNEL=="*"). –  Gilles 'SO- stop being evil' 22.02.2013, 17:28
  • 3
    я попробовал это также, но так как он работает на Вас, я должен пропускать шаг. Я переместил этот вопрос сюда, таким образом, я могу записать пример кода. –  Redsandro 22.02.2013, 17:36

Я изучил /lib/udev/rules.d для примеров связанных с диском правил. В системе Ubuntu один файл правила обеспечивает переменную среды ID_FS_UUID_ENC который можно использовать в собственных файлах правила.

Таким образом я поместил файл пользовательского правила под /etc/udev/rules.d/foodevice.rules. Так как это не снабжается префиксом число, это, работал наконец udev. Btw, udev наблюдаемый демон /etc/udev/rules.d для изменений, таким образом, что Вы не должны перезапускать его на изменениях файла.

Содержание /etc/udev/rules.d/foodevice.rules :

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"

(это - одно правило - необходимо удалить новую строку после огибающего пункта, потому что udev не имеет механизма продолжения строки),

Программа, запущенная udev блоками демон - таким образом, это не должно работать в течение долгого времени. Я решил его через at - т.е. через отсоединение от процесса, делающего реальную работу:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
14
27.01.2020, 19:35
  • 1
    Вы, возможно, должны были бы перезагрузить использование правил udev udevadm control --reload-rules, В зависимости от Вашего распределения. –  user44038 29.07.2013, 16:44
  • 2
    Вместо at now Я предлагаю batch. –  Reinstate Monica - M. Schröder 23.06.2014, 19:04
  • 3
    Что сделать, когда у Вас нет ни одного at ни batch? Я нахожусь во встроенной среде с busybox. –  natenho 27.04.2015, 23:58
  • 4
    @natenho, можно использовать ~/path/mountcopystuff.sh & - at и т.д. имеет преимущество, что Вы получаете уведомления по электронной почте в случае, если что-то идет не так, как надо - но во встроенной системе это, вероятно, не очень интересно. –  maxschlepzig 28.04.2015, 00:22

Теги

Похожие вопросы