CAT не записывает полученные с устройства данные (При запуске bash скрипта с udev правил, скрипт работает но не полностью)

Kubuntu, Xubuntu и другие

Модератор: Модераторы разделов

Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

CAT не записывает полученные с устройства данные

Сообщение Unixum »

В общем я новичок с установленной Ubuntu Server 16.04.5, бьюсь с этой проблемой уже второй день. Обычно для решения какой либо задачи, пользуюсь поиском, но это как я вижу не тот случай, так как нарыть решение на данную проблему мне не удалось.
Короче у меня есть Arduino Nano и сценарий такой - я хочу чтобы при вставке этого устройства USB в udev правилах запускался определенный bash скрипт, вот правило для моего устройства:

Код: Выделить всё

KERNEL=="ttyUSB[0-9]*",MODE="0777"

ACTION=="add", SUBSYSTEM=="usb",ENV{ID_MODEL_FROM_DATABASE}=="HL-340 USB-Serial adapter", ENV{ID_SERIAL}=="1a86_USB2.0-Serial",RUN+="/arduino/arduino_setup.sh"
а вот и сам скрипт:

Код: Выделить всё

#!/bin/bash

sf=/var/www/sh/serial.txt

sleep 5
stty -F /dev/ttyUSB0 raw -echo 115200
nohup cat /dev/ttyUSB0 > $sf &
И получается так что, когда я перезагружаюсь и через некоторое время (в любое) вставляю ардуинку, то скрипт срабатывает но не полностью.
Файл serial.txt по указанному пути создается но он пустой - данные никакие не записываются, хоть они с устройства передаются ежесекундно с установленной скоростью передачи 115200 бод на обоих концах. А вот когда я выдергиваю устройство а потом вставляю обратно, то все отлично работает - данные успешно начинают записываться в файл.
Вот почему cat срабатывает со второго раза только? Я уже и слипинги настраивал с разным промежутком времени и от 1 сек. и до 20, даже в разных местах sleep вставлял, но в итоге ничего не получается.
Кстати скорость на stty тоже не устанавливается с первого раза, после выполнения скрипта скорость стоит как 9600, но после повторного вставления устройства как я уже писал выше - все отлично работает, скорость устанавливается а данные успешно пишутся в файл.
Еще что заметил - тоже после перезагрузки когда вставляю устройство а потом запускаю скрипт в ручную через терминал, то все работает с первого раза без каких либо проблем.
Может у кого есть какие идеи? Буду очень благодарен :band1:
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

Неожиданно нашел решение! :1a:

Посмотрев сюда:

Код: Выделить всё

# udevadm info /dev/ttyUSB0

P: /devices/pci0000:00/0000:00:1a.1/usb4/4-1/4-1:1.0/ttyUSB0/tty/ttyUSB0
N: ttyUSB0
S: serial/by-id/usb-1a86_USB2.0-Serial-if00-port0
S: serial/by-path/pci-0000:00:1a.1-usb-0:1:1.0-port0
E: DEVLINKS=/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0 /dev/serial/by-path/pci-0000:00:1a.1-usb-0:1:1.0-port0
E: DEVNAME=/dev/ttyUSB0
E: DEVPATH=/devices/pci0000:00/0000:00:1a.1/usb4/4-1/4-1:1.0/ttyUSB0/tty/ttyUSB0
E: ID_BUS=usb
E: ID_MODEL=USB2.0-Serial
E: ID_MODEL_ENC=USB2.0-Serial
E: ID_MODEL_FROM_DATABASE=HL-340 USB-Serial adapter
E: ID_MODEL_ID=7523
E: ID_PATH=pci-0000:00:1a.1-usb-0:1:1.0
E: ID_PATH_TAG=pci-0000_00_1a_1-usb-0_1_1_0
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
E: ID_PCI_INTERFACE_FROM_DATABASE=UHCI
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
E: ID_REVISION=0263
E: ID_SERIAL=1a86_USB2.0-Serial
E: ID_TYPE=generic
E: ID_USB_CLASS_FROM_DATABASE=Vendor Specific Class
E: ID_USB_DRIVER=ch341
E: ID_USB_INTERFACES=:ff0102:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=1a86
E: ID_VENDOR_ENC=1a86
E: ID_VENDOR_FROM_DATABASE=QinHeng Electronics
E: ID_VENDOR_ID=1a86
E: MAJOR=188
E: MINOR=0
E: SUBSYSTEM=tty
E: TAGS=:systemd:
E: USEC_INITIALIZED=30971864

Я увидел что у меня SUBSYSTEM не usb оказывается а tty!
В правиле просто изменил с SUBSYSTEM=="usb" на SUBSYSTEM=="tty" и все заработало.

Код: Выделить всё

KERNEL=="ttyUSB[0-9]*",MODE="0777"

ACTION=="add", SUBSYSTEM=="tty",ENV{ID_MODEL_FROM_DATABASE}=="HL-340 USB-Serial adapter", ENV{ID_SERIAL}=="1a86_USB2.0-Serial",RUN+="/arduino/arduino_setup.sh"
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

И еще сам скрипт немного подрезал.
Было так:

Код: Выделить всё

#!/bin/bash

sf=/var/www/sh/serial.txt

sleep 5
stty -F /dev/ttyUSB0 raw -echo 115200
nohup cat /dev/ttyUSB0 > $sf &
А сделал так:

Код: Выделить всё

#!/bin/bash

sf=/var/www/sh/serial.txt

stty -F /dev/ttyUSB0 raw -echo 115200
cat /dev/ttyUSB0 > $sf
Вывод в nohup в фоновом выполнении вместе с задержкой как я понял даже не понадобился.
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

Тему можно закрывать!
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: CAT не записывает полученные с устройства данные

Сообщение Vascom »

Молодец, что отписался о решении.
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

Не все так солнечно как показалось на несколько минут :(
Теперь наблюдается следующая проблема - через некоторое время (примерно 1 мин.) вылетает cat (а точнее само устройство) с такими логами:

Код: Выделить всё

Dec 28 10:25:46 sh systemd-udevd[438]: seq 2327 '/devices/pci0000:00/0000:00:1a.1/usb4/4-2/4-2:1.0/ttyUSB0/tty/ttyUSB0' killed
Dec 28 10:25:46 sh systemd-udevd[438]: worker [1721] terminated by signal 9 (Killed)
Dec 28 10:25:46 sh systemd-udevd[438]: worker [1721] failed while handling '/devices/pci0000:00/0000:00:1a.1/usb4/4-2/4-2:1.0/ttyUSB0/tty/ttyUSB0'
Находил информацию мол signal 9 связан с памятью, что как бы памяти стало маловато почему-то, но я это промониторил и никакой нехватки не заметил.
У меня оперативки 2 gb в процессе использовалось максимум 200 mb. Во время вылета никаких превышений замечено не было.
Кстати после этого вылета восстановить соединение с устройством больше не удавалось, получалось только после перезагрузки.

Если запускаться в ручную, то никаких вылетов нет:

Код: Выделить всё

# stty -F /dev/ttyUSB0 raw -echo 115200
# nohup cat /dev/ttyUSB0 >> $sf &
Может есть какие варианты?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5362
ОС: Gentoo

Re: CAT не записывает полученные с устройства данные

Сообщение /dev/random »

Unixum писал:
28.12.2018 10:42

Код: Выделить всё

Dec 28 10:25:46 sh systemd-udevd[438]: seq 2327 '/devices/pci0000:00/0000:00:1a.1/usb4/4-2/4-2:1.0/ttyUSB0/tty/ttyUSB0' killed
Dec 28 10:25:46 sh systemd-udevd[438]: worker [1721] terminated by signal 9 (Killed)
Dec 28 10:25:46 sh systemd-udevd[438]: worker [1721] failed while handling '/devices/pci0000:00/0000:00:1a.1/usb4/4-2/4-2:1.0/ttyUSB0/tty/ttyUSB0'

man udev

RUN{type}
...
Starting daemons or other long-running processes is not appropriate
for udev; the forked processes, detached or not, will be
unconditionally killed after the event handling has finished.
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

/dev/random писал:
28.12.2018 10:49
RUN{type}
...
Starting daemons or other long-running processes is not appropriate
for udev; the forked processes, detached or not, will be
unconditionally killed after the event handling has finished.
Находил ифу об этом, но не понятно как это обойти, так сказать запустить процесс отдельно?

вроде как должна помогать команда disown (nohup cat /dev/tyUSB0 > /var/www/sh/serial.txt & disown), она вроде как должна запускать процесс отдельно, но это что-то не помогает к большому сожалению.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5362
ОС: Gentoo

Re: CAT не записывает полученные с устройства данные

Сообщение /dev/random »

Unixum писал:
28.12.2018 10:56
Находил ифу об этом, но не понятно как это обойти, так сказать запустить процесс отдельно?

вроде как должна помогать команда disown (nohup cat /dev/tyUSB0 > /var/www/sh/serial.txt & disown), она вроде как должна запускать процесс отдельно, но это что-то не помогает к большому сожалению.
Запускать не через udev. Больше никак. В процитированном фрагменте мана ясно сказано, что процесс убивается независимо от того, отсоединён он или нет.

Можете, например, написать юнит systemd, зависящий от этого устройства.
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

Кстати все таки получилось обойти отсоединения, вот таким вот хитрим способом
# arduino_setup.sh

Код: Выделить всё

#!/bin/sh

echo /arduino/start.sh | at now
# start.sh

Код: Выделить всё

#!/bin/bash

stty -F /dev/ttyUSB0 raw -echo 115200
nohup cat /dev/ttyUSB0 >> /var/www/sh/serial.txt &
Но все равно после извлечения устройства приходится перезагружаться.
Короче копаем дальше...
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5362
ОС: Gentoo

Re: CAT не записывает полученные с устройства данные

Сообщение /dev/random »

Unixum писал:
28.12.2018 11:41
Кстати все таки получилось обойти отсоединения, вот таким вот хитрим способом
То есть запускаете через atd вместо udev, а через udev просто информируете atd о том, что и когда запускать.
Unixum писал:
28.12.2018 11:41
Но все равно после извлечения устройства приходится перезагружаться.
Продолжает ли процесс работать после извлечения или завершается? Что в логах udev при подсоединении и отсоединении, с вашим скриптом и без него?
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

/dev/random писал:
28.12.2018 11:50
То есть запускаете через atd вместо udev, а через udev просто информируете atd о том, что и когда запускать.
arduino_setup.sh через udev а start.sh через at как я и написал.
/dev/random писал:
28.12.2018 11:50
Продолжает ли процесс работать после извлечения или завершается? Что в логах udev при подсоединении и отсоединении, с вашим
Чуть позже в логах пороюсь посмотрю чего там. Скорей всего какие-то процессы по любому продолжают выполняться после извлечения.
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

Вот короче просмотрел что происходит в логах во время вставки - извлечения - повторной вставки - повторного извлечения устройства.
Видно что вроде как не запустились процессы usbcore и usbserial при повторной вставке устройства.
Вот лог. Для наглядности я поставил минуса где по моему мнению вроде как должны были запуститься эти недостающие процессы.

Вставляю устройство:

Код: Выделить всё

Dec 28 12:51:21 sh kernel: [   93.496014] usb 4-2: new full-speed USB device number 2 using uhci_hcd
Dec 28 12:51:22 sh kernel: [   93.664014] usb 4-2: New USB device found, idVendor=1a86, idProduct=7523
Dec 28 12:51:22 sh kernel: [   93.664019] usb 4-2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
Dec 28 12:51:22 sh kernel: [   93.664022] usb 4-2: Product: USB2.0-Serial
Dec 28 12:51:22 sh kernel: [   93.686944] usbcore: registered new interface driver usbserial
Dec 28 12:51:22 sh kernel: [   93.686957] usbcore: registered new interface driver usbserial_generic
Dec 28 12:51:22 sh kernel: [   93.686968] usbserial: USB Serial support registered for generic
Dec 28 12:51:22 sh kernel: [   93.688533] usbcore: registered new interface driver ch341
Dec 28 12:51:22 sh kernel: [   93.688868] usbserial: USB Serial support registered for ch341-uart
Dec 28 12:51:22 sh kernel: [   93.688886] ch341 4-2:1.0: ch341-uart converter detected
Dec 28 12:51:22 sh kernel: [   93.701083] usb 4-2: ch341-uart converter now attachedto ttyUSB0
Извлекаю:

Код: Выделить всё

Dec 28 12:52:42 sh kernel: [  174.496072] usb 4-2: USB disconnect, device number 2
Dec 28 12:52:42 sh kernel: [  174.497707] usb 4-2: failed to send control message: -19
Dec 28 12:52:42 sh kernel: [  174.498037] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
Dec 28 12:52:42 sh kernel: [  174.498049] ch341 4-2:1.0: device disconnected
Вставляю повторно:

Код: Выделить всё

Dec 28 12:53:18 sh kernel: [  209.840030] usb 4-2: new full-speed USB device number 3 using uhci_hcd
Dec 28 12:53:18 sh kernel: [  210.211052] usb 4-2: New USB device found, idVendor=1a86, idProduct=7523
Dec 28 12:53:18 sh kernel: [  210.211057] usb 4-2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
Dec 28 12:53:18 sh kernel: [  210.211060] usb 4-2: Product: USB2.0-Serial
-
-
-
-
-
Dec 28 12:53:18 sh kernel: [  210.214108] ch341 4-2:1.0: ch341-uart converter detected
Dec 28 12:53:18 sh kernel: [  210.227107] usb 4-2: ch341-uart converter now attachedto ttyUSB0
Извлекаю:

Код: Выделить всё

Dec 28 12:54:03 sh kernel: [  255.344070] usb 4-2: USB disconnect, device number 3
Dec 28 12:54:03 sh kernel: [  255.346116] usb 4-2: failed to send control message: -19
Dec 28 12:54:03 sh kernel: [  255.346448] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
Dec 28 12:54:03 sh kernel: [  255.346459] ch341 4-2:1.0: device disconnected
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

Да блин нет. Эти недостающие строки просто регистрация устройства.
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

Вот это что?

Код: Выделить всё

Dec 28 12:52:42 sh kernel: [  174.497707] usb 4-2: failed to send control message: -19
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5362
ОС: Gentoo

Re: CAT не записывает полученные с устройства данные

Сообщение /dev/random »

Unixum писал:
28.12.2018 13:24
Вот это что?

Код: Выделить всё

Dec 28 12:52:42 sh kernel: [  174.497707] usb 4-2: failed to send control message: -19
Это кто-то пытается послать команду устройству уже после его отключения. Вряд ли проблема в этом.

Но вы так и не ответили на мои вопросы. Во-первых, я говорил о логах udev, а не ядра. Во-вторых, первый вопрос важнее, чем логи: продолжает ли cat работать после отключения устройства, или завершается? Если продолжает, то вам нужно его завершить. Демон atd, через который вы запускаете cat, не умеет сам завершать процессы. Если же cat и без этого убивается ядром из-за обращения к несуществующему устройству, то нужно искать проблему в другом месте. Например, сравнить логи udev, о которых я говорил.
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

/dev/random писал:
28.12.2018 13:43
Но вы так и не ответили на мои вопросы. Во-первых, я говорил о логах udev, а не ядра.
Потому как udev логов не нашел. в директории /var/log udev логов нету. Может они где-то в другом месте? Если знаете то подскажите пожалуйста.
/dev/random писал:
28.12.2018 13:43
продолжает ли cat работать после отключения устройства, или завершается?
Скорей всего завершается, так как в процессах я его не нашел и демона тоже.

Дело вот в чем, я заметил в чем причина, но пока не знаю как его решить.
Дело в том что когда случайно сделаешь передачу на устройство в то время когда его нет (не вставлено в usb порт) таким способом "echo 'string' > /dev/ttyUSB", то тогда и происходит вот этот сбой и нельзя потом обратиться к этому устройству в будущем до перезагрузки. Приходится перезагружаться.
А так если не отправлять на отсутствующее устройство то все работает без проблем - можно извлекать и вставлять без проблем.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5362
ОС: Gentoo

Re: CAT не записывает полученные с устройства данные

Сообщение /dev/random »

Unixum писал:
28.12.2018 14:06
Дело в том что когда случайно сделаешь передачу на устройство в то время когда его нет (не вставлено в usb порт) таким способом "echo 'string' > /dev/ttyUSB", ...
...то bash создаёт текстовый файл /dev/ttyUSB со строкой "string", который потом мешает создать одноимённое устройство. Удалите его.
Спасибо сказали:
Unixum
Сообщения: 15
ОС: Ubuntu Server 16.04.5

Re: CAT не записывает полученные с устройства данные

Сообщение Unixum »

Так и есть! :clap2:
Огромное спасибо за помощь!!! :clap3:
Спасибо сказали: