Отключите и снова подключите USB-устройство в терминале

В Upstart Intro, Cookbook и Best Practices имеется большое количество фрагментов кода, которые можно использовать при создании задач и заданий выскочки.

Раздел Upstart Intro, Cookbook и Best Practices поваренной книги говорит, что /etc/init/rc.conf будет запущен и вызовет /etc/init.d/rc. В свою очередь это в конечном итоге вызовет /etc/init.d/sendsigs. Итак, если вы start on starting rc, то ваша задача будет выполнена до rc (и сигнмеры, которые обычно завершат процесс).

file: /etc/init/test.conf

[ f1]

файл: /etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long

2
задан 15 May 2018 в 10:45

2 ответа

Я написал сценарий, чтобы показать, как я это сделаю:

#!/bin/bash port="1-1.1" # as shown by lsusb -t: {bus}-{port}(-{subport}) bind_usb() { echo "$1" >/sys/bus/usb/drivers/usb/bind } unbind_usb() { echo "$1" >/sys/bus/usb/drivers/usb/unbind } unbind_usb "$port" # sleep 1 # enable delay here bind_usb "$port"

Сначала вам нужно получить номер шины и порта порта usb. Вы можете сделать это с помощью lsusb и любого устройства, которое вы узнаете на выходе lsusb, я использую Sandend pendrive здесь:

$ lsusb Bus 001 Device 005: ID 04f2:b39a Chicony Electronics Co., Ltd Bus 001 Device 112: ID 8087:07dc Intel Corp. Bus 001 Device 019: ID 04d9:1603 Holtek Semiconductor, Inc. Keyboard Bus 001 Device 018: ID 0424:2504 Standard Microsystems Corp. USB 2.0 Hub Bus 001 Device 022: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 001 Device 002: ID 8087:8000 Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub $ lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M |__ Port 1: Dev 22, If 0, Class=Mass Storage, Driver=usb-storage, 480M |__ Port 2: Dev 18, If 0, Class=Hub, Driver=hub/4p, 480M |__ Port 1: Dev 19, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 1: Dev 19, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 7: Dev 112, If 0, Class=Wireless, Driver=btusb, 12M |__ Port 7: Dev 112, If 1, Class=Wireless, Driver=btusb, 12M |__ Port 8: Dev 5, If 1, Class=Video, Driver=uvcvideo, 480M |__ Port 8: Dev 5, If 0, Class=Video, Driver=uvcvideo, 480M

На выходе lsusb вы получаете шину и номер устройства, затем выполните поиск этого устройства на выходе lsusb -t, чтобы получить номер шины и порта (иногда с подписями). Синтаксис:

1-2.3 # for Bus 1 Port 2 Subport 3 – strip leading zeroes!

Используйте это как port в скрипте. Теперь вам просто нужно сделать его исполняемым с помощью chmod +x /path/to/script и запустить его Sandisk :

sudo /path/to/script

Мне не нужен был один для моего pendrive, но это может быть необходимо для вы снова добавите задержку между повторным связыванием и привязкой, это то, о чем прокомментировала строка sleep 1, - вы можете поэкспериментировать со значениями, например sleep 0.5 в течение половины секунды.

Обратите внимание, что этот подход показывает, как отключить и снова включить определенный USB-порт, если вы хотите, чтобы определенное устройство было отключено и снова отскок, вам придется использовать тот же USB-порт для этого. Можно было бы придумать способ анализа синтаксиса lsusb для динамического получения номера шины и порта определенного устройства каждый раз при вызове сценария, это позволит вам использовать любой USB-порт, но я считаю, что это будет

Предложения, взятые из этой статьи блога linux.com.

1
ответ дан 17 July 2018 в 14:16

Я написал сценарий, чтобы показать, как я это сделаю:

#!/bin/bash port="1-1.1" # as shown by lsusb -t: {bus}-{port}(-{subport}) bind_usb() { echo "$1" >/sys/bus/usb/drivers/usb/bind } unbind_usb() { echo "$1" >/sys/bus/usb/drivers/usb/unbind } unbind_usb "$port" # sleep 1 # enable delay here bind_usb "$port"

Сначала вам нужно получить номер шины и порта порта usb. Вы можете сделать это с помощью lsusb и любого устройства, которое вы узнаете на выходе lsusb, я использую Sandend pendrive здесь:

$ lsusb Bus 001 Device 005: ID 04f2:b39a Chicony Electronics Co., Ltd Bus 001 Device 112: ID 8087:07dc Intel Corp. Bus 001 Device 019: ID 04d9:1603 Holtek Semiconductor, Inc. Keyboard Bus 001 Device 018: ID 0424:2504 Standard Microsystems Corp. USB 2.0 Hub Bus 001 Device 022: ID 0781:5567 SanDisk Corp. Cruzer Blade Bus 001 Device 002: ID 8087:8000 Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub $ lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M |__ Port 1: Dev 22, If 0, Class=Mass Storage, Driver=usb-storage, 480M |__ Port 2: Dev 18, If 0, Class=Hub, Driver=hub/4p, 480M |__ Port 1: Dev 19, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 1: Dev 19, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 7: Dev 112, If 0, Class=Wireless, Driver=btusb, 12M |__ Port 7: Dev 112, If 1, Class=Wireless, Driver=btusb, 12M |__ Port 8: Dev 5, If 1, Class=Video, Driver=uvcvideo, 480M |__ Port 8: Dev 5, If 0, Class=Video, Driver=uvcvideo, 480M

На выходе lsusb вы получаете шину и номер устройства, затем выполните поиск этого устройства на выходе lsusb -t, чтобы получить номер шины и порта (иногда с подписями). Синтаксис:

1-2.3 # for Bus 1 Port 2 Subport 3 – strip leading zeroes!

Используйте это как port в скрипте. Теперь вам просто нужно сделать его исполняемым с помощью chmod +x /path/to/script и запустить его Sandisk :

sudo /path/to/script

Мне не нужен был один для моего pendrive, но это может быть необходимо для вы снова добавите задержку между повторным связыванием и привязкой, это то, о чем прокомментировала строка sleep 1, - вы можете поэкспериментировать со значениями, например sleep 0.5 в течение половины секунды.

Обратите внимание, что этот подход показывает, как отключить и снова включить определенный USB-порт, если вы хотите, чтобы определенное устройство было отключено и снова отскок, вам придется использовать тот же USB-порт для этого. Можно было бы придумать способ анализа синтаксиса lsusb для динамического получения номера шины и порта определенного устройства каждый раз при вызове сценария, это позволит вам использовать любой USB-порт, но я считаю, что это будет

Предложения, взятые из этой статьи блога linux.com.

1
ответ дан 20 July 2018 в 14:20
  • 1
    Я получил скрипт, работающий над другой мышью (меня нет дома). Мне придется протестировать эту проблему. И если он решает проблему, мне придется выяснить, как запускать сценарии с разрешениями при запуске. Между тем, спасибо! – deanresin 17 May 2018 в 23:25
  • 2
    @deanresin Добро пожаловать! Я использовал бы root cron, как описано в этом ответе , только для root cron вы редактируете crontab с sudo crontab -e. Строкой для добавления будет @reboot /path/to/script без sudo. – dessert 17 May 2018 в 23:36
  • 3
    Отличное решение ... Я думаю, что раньше использовал root-cron. – deanresin 18 May 2018 в 01:08
  • 4
    К сожалению, это не сработает. Я все еще должен физически удалить USB-трансивер и подключить его обратно. Кроме того, @reboot не работает на моей машине (Ubuntu 16.04) – deanresin 19 May 2018 в 06:53

Другие вопросы по тегам:

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