Скрипт для слежения за подключением/отключением устройств /dev/ttyUSB и /dev/ttyACM

Пользователям Линукса хочу представить небольшой скрипт, который выводит уведомления на рабочий стол о подключении/отключении устройств /dev/ttyUSB и /dev/ttyACM:




/dev/ttyUSB и /dev/ttyACM — это устройства, которые создаются при подключении переходников USB-UART или USB-модемов. Иногда нужно знать под каким номером подключено устройство. Для этого можно воспользоваться командой:
ls /dev/ttyUSB*

Но постоянно ей пользоваться может утомить. Меня, например, утомило и я сделал скрипт, который автоматически сообщает о подключении/отключении устройств.

Скрипт выложен на Гитхаб.

Работоспособность скрипта я проверил только на Xubuntu версий 13.10 и 12.10. Буду рад, если мне сообщат о его работоспособности в других дистрибутивах.

Уведомления на рабочий стол выводятся с помощью программы notify-send, которая должна присутствовать во многих дистрибутивах.

Также скрипт использует утилиту inotifywait из пакета inotify-tools, который во многих системах доступен из родного репозитория. Утилита следит за созданием/удалением файлов в /dev. При отсутствии утилиты скрипт опрашивает каталог /dev раз в секунду.

Кроме уведомлений на рабочий стол, скрипт выводит уведомления в стандартный поток в следующем виде:
[01.01.2013 20:20:01] Подключено ttyUSB0
[01.01.2013 20:20:05] Подключено ttyUSB1
[01.01.2013 20:20:08] Отключено ttyUSB0
[01.01.2013 20:20:10] Отключено ttyUSB1

Рекомендую добавить скрипт в автозагрузку.

Для тех, кому лень ходить на Гитхаб, привожу скрипт здесь:
#!/bin/bash

# Скрипт для слежения за подключением/отключением устройств /dev/ttyUSB и /dev/ttyACM.
#
# Сайт проекта: https://github.com/bravikov/detect-ttyusb
#
# Зависимости:
#    inotify-tools (для наблюдения за изменениями вкаталоге /dev)
#    notify-send (для уведомлений на рабочем столе)
#
# С помощью утилиты из inotify-tools скрипт устанавливает слежение за каталогом /dev и в случае его изменения дает об этом знать. Если inotify-tools не установлен, то скрипт проверяет каталог /dev раз в секунду.
#
# Пример вывода:
#[01.01.2013 20:20:01] Подключено ttyUSB0
#[01.01.2013 20:20:05] Подключено ttyUSB1
#[01.01.2013 20:20:08] Отключено ttyUSB0
#[01.01.2013 20:20:10] Отключено ttyUSB1


NOTIFY_SEND_SUMMARY="Слежение за устройствами /dev/ttyUSB и /dev/ttyACM"

DIR="/dev"

PREV_DEV_LIST=""
while [ 1 ]
do
    DEV_LIST="`ls \"$DIR\" | grep 'ttyUSB\|ttyACM'`"
    
    ##### find new device #####
    for DEV in $DEV_LIST
    do
        NEW_DEV=yes
        
        for PREV_DEV in $PREV_DEV_LIST
        do
            if [ "$DEV" == "$PREV_DEV" ]
            then
                NEW_DEV=no
                break
            fi
        done
        
        if [ $NEW_DEV == yes ]
        then
            echo [`date "+%x %X"`] Подключено $DEV
            NOTIFY_SEND_BODY="`date "+%x %X"`\nПодключено устройство\n/dev/$DEV"
            notify-send "$NOTIFY_SEND_SUMMARY" "$NOTIFY_SEND_BODY"
        fi
    done
    ###########################
    
    ##### find remote device #####
    for PREV_DEV in $PREV_DEV_LIST
    do
        REMOTE_DEV=yes
        
        for DEV in $DEV_LIST
        do
            if [ "$DEV" == "$PREV_DEV" ]
            then
                REMOTE_DEV=no
                break
            fi
        done
        
        if [ $REMOTE_DEV == yes ]
        then
            echo [`date "+%x %X"`] Отключено $PREV_DEV
            NOTIFY_SEND_BODY="`date "+%x %X"`\nОтключено устройство\n/dev/$PREV_DEV"
            notify-send "$NOTIFY_SEND_SUMMARY" "$NOTIFY_SEND_BODY"
        fi
    done
    ##############################
    
    PREV_DEV_LIST="$DEV_LIST"
    
    if [ -x "`which inotifywait`" ]
        then
            inotifywait -e create -e delete "$DIR" > /dev/null 2>&1
        else
            sleep 1
    fi
done
  • +1
  • 17 декабря 2013, 09:07
  • bravikov

Комментарии (10)

RSS свернуть / развернуть
Посмотри habrahabr.ru/post/206122/ там скрипт выполняется по событию от udev.
+1
Такие вещи лучше делать через udev, выше уже дали ссылку на образец :)
0
Пардон за нубский вопрос… А как запилить щоб при подключении USB-UART не нужно было в терминале ручками каждый раз прописывать sudo chmod?
0
  • avatar
  • kalik
  • 17 декабря 2013, 17:43
Выполните несколько команд:
echo KERNEL==\"ttyUSB*\", MODE=\"0666\" > 51-usb-uart-mode.rules
sudo mv 51-usb-uart-mode.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules

Здесь создается файл 51-usb-uart-mode.rules с содержимым:
KERNEL=="ttyUSB*", MODE="0666"

Затем файл копируется в каталог /etc/udev/rules.d/
Таким образом создается правило для udev. А udev управляет устройствами в Линукс.
Последняя команда говорит udev перезагрузить правила.
+2
Еще один вариант.
Устройствам ttyUSB по умолчанию присваивается группа dialout с правами записи и чтения. Можно добавить своего пользователя в эту группу и иметь права.
+1
Спасибо большое=))
0
еще бы сделать в виде Gnome Shell Extension habrahabr.ru/post/195578/
wiki.gnome.org/Projects/GnomeShell/Extensions
0
0
Я бо посоветовал также в секции подключения/отключения добавить вывод в syslog, это не менее полезно
0
Логи и так ведутся, самой системой.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.