Правило Udev, устанавливающее сокет SocketCAN, работает правильно только при запуске вручную

В моем случае такое же сообщение об ошибке появлялось, если файл был либо .ksh, либо .sh, например:

-ksh: ./somefile.sh: not found [No such file or directory]

Оказывается, проблема с доступом.

Даже если вы сделаете этот файл исполняемым, на сервере вам могут потребоваться права администратора для запуска. Я мог бы запустить командную строку, но выполнение скрипта не было бы найдено, попробуйте запустить скрипт в sudo, тогда вы узнаете, разрешено ли вам запускать скрипт как root или нет.

1
31.05.2016, 11:38
2 ответа

Таким образом, решение для того, чтобы заставить Canusb работать в udev, было найдено Куртом Ван Дейком:

Иногда можно иметь условия гонки с правилами udev, поскольку не все атрибуты присутствуют при запуске uevent

Это обновленное /usr/local/bin/slcan_add.sh заставляет CanUsb правильно работать с udev при подключении:

#!/bin/sh
# Bind the USBCAN device
sleep 1
/usr/local/bin/slcand -o -c -f -s8 /dev/$1 slcan0
sleep 2
ifconfig slcan0 up

Мне еще предстоит выяснить, как заставить Ixxat Can-to-Usb V2 работать с SocketCan.

2
28.01.2020, 01:17

Похоже, udev не может справиться с длительным процессом .
И slcand запускает длительный процесс. Используя один из ответов вышеприведенной темы, решите проблему.

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

Сервис

[Unit]
Description="Instance of slcand for can #%i"

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/slcan_add %i

slcan _добавить

#!/bin/sh
/usr/bin/slcand -o -c -f -s8 /dev/tty$1 $1
sleep 2
/sbin/ip link set up $1
/sbin/ip link set $1 txqueuelen 80

while :; do sleep 86400; done

правило udev

SUBSYSTEM=="tty",..., ACTION=="add", SYMLINK+="name1", RUN+="/usr/sbin/service can@name1 start"
SUBSYSTEM=="tty",..., ACTION=="remove", RUN+="/usr/sbin/service can@name1 stop"

.. содержит idVendor, idProduct и серийный номер адаптеров банок.

Примечания:

Наличие нескольких запущенных экземпляров slcan для устройства может вызвать проблемы.
Используйте ps aux | grep slcan, чтобы проверить, запущен ли уже экземпляр slcan.
Следующая команда убивает все процессы, запущенные командой, содержащейslcan:

sudo kill $(ps aux | grep slcand | awk -F ' ' '{print $2}' | head -1)
0
03.12.2021, 07:33

Теги

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