Автозапуск сценария после того, как я подключил или отключил USB-устройство

22

Что я могу сделать, чтобы автоматически запустить скрипт после того, как я подключил / подключил или отключил / отключил USB-устройство?

Раду Рэдяну
источник
2
@XxxXxx: это не вариант, если у Cuttlefish нет версии для Ubuntu 12.10
Radu Rădeanu
2
Возможный дубликат: askubuntu.com/questions/25071/…
Glutanimate,
@Glutanimate: этот вопрос касается конкретной USB-флешки, но я спрашивал об USB-устройстве, в целом
Раду Рэдяну
@Glutanimate: давайте предположим, что ответы на этот вопрос полезны, в любом случае не отвечает, как автоматически запускать сценарий после того, как я отключил USB-устройство.
Раду Рэдяну
1
«Допустим, что ответы на этот вопрос полезны, в любом случае не отвечает на вопрос о том, как автоматически запускать сценарий после того, как я отключил USB-устройство» «Я предполагаю, что если вы измените« ACTION = 'add' »на« ACTION = » «удалить», это было бы хорошим местом для начала.
Блюджей

Ответы:

17

Благодаря MinimusHeximus и соответствующий вклад в поток он упомянул в своем комментарии к моему подобному вопросу, я думаю , что теперь я могу предложить вам следующий ответ.

Для такого USB-устройства вам потребуется 5 (пять) файлов, просто указав соответствующие значения <fortheseparts>:

/etc/udev/rules.d/00-usb-<yourdevice>.rules

ACTION=="add", ATTRS{idVendor}=="<yourvendorid>", ATTRS{idProduct}=="<yourproductid>", ENV{XAUTHORITY}="/home/<user>/.Xauthority", ENV{DISPLAY}=":0", OWNER="<user>", RUN+="/usr/local/bin/usb-<yourdevice>-in_udev"    
ACTION=="remove", ATTRS{idVendor}=="<yourvendorid>", ATTRS{idProduct}=="<yourproductid>", ENV{XAUTHORITY}="/home/<user>/.Xauthority", ENV{DISPLAY}=":0", OWNER="<user>", RUN+="/usr/local/bin/usb-<yourdevice>-out_udev"

/usr/local/bin/usb-<yourdevice>-in_udev

#!/bin/bash
/usr/local/bin/usb-<yourdevice>-in &

/usr/local/bin/usb-<yourdevice>-in

#!/bin/bash
sleep 1
<yourbashscriptcode>

/usr/local/bin/usb-<yourdevice>-out_udev

#!/bin/bash
/usr/local/bin/usb-<yourdevice>-out &

/usr/local/bin/usb-<yourdevice>-out

#!/bin/bash
sleep 1
<yourbashscriptcode>

Заметки:

  1. Вы можете зафиксировать значения <yourvendorid>и <yourproductid>ввести команду lsusbв Терминале - когда ваше USB-устройство подключено - который выведет список всех ваших USB-устройств, доступных в настоящий момент, например Bus 003 Device 002: ID 8087:07da Intel Corp., где 8087 - это VendorID, а 07da - ProductID .
  2. И <yourdevice>может быть любым произвольным именем, которое вы можете выбрать для своего USB-устройства, например, я решил использовать общее имя « клавиатура » при создании таких файлов для моей USB-клавиатуры, для которых требовалось применять другую раскладку клавиатуры, когда она подключена.
  3. В некоторых случаях это может быть необходимо использовать ACTION=="remove"строку в файле правил udev, а следовательно , и связанные с ним 2 (два) « out» файлами, если вам не нужно делать что - либо (например , обратное изменение сделано , когда устройство подключен) после того, как устройство отключено.
Сади
источник
Это выглядит неправильно с моей точки зрения новичка. Разве эти пункты не должны быть в одной строке?
Nafg
1
Это работает: ACTION == "add", ATTRS {idVendor} == "...", ATTRS {idProduct} == "...", ENV {XAUTHORITY} = "/ home / <user> /. Xauthority" , ENV {DISPLAY} = ": 0", RUN + = "<script>"
nafg
@nafg: с моей точки зрения новичка, это не должно иметь никакого значения, если вы поместите все это в одну строку (используя запятую в качестве разделителя) в файле правил udev, но я вижу, что вы добавили параметры XAUTHORITY и DISPLAY в правила udev, которые может работать для вас или кого-то еще, и в этом случае мне интересно, если они больше не нужны в двух файлах скриптов ниже.
Сади
1
да в том-то и дело, что вам больше не нужен промежуточный скрипт (за исключением, может быть, фактического сценария в фоновом режиме), поскольку udev позволяет вам задавать среду. Также я понимаю из документов udev, что каждая строка является независимым правилом, строки в файле не объединяются.
Нафг
@nafg: Спасибо за ваш ценный вклад. Я перенес эти среды в правила udev, и это сработало и для меня. Кроме того, я переместил сценарии в / usr / local / bin, так как начал сталкиваться с проблемами после того, как переместил свою папку / home в отдельный раздел (вероятно, потому что он не был смонтирован ранее). Кажется, использование разрывов строк в правилах udev не создает проблем, по крайней мере, в моей системе (Ubuntu 13.04 64 bit), и я предпочел это для удобства чтения.
Сади