В моем случае такое же сообщение об ошибке появлялось, если файл был либо .ksh, либо .sh, например:
-ksh: ./somefile.sh: not found [No such file or directory]
Оказывается, проблема с доступом.
Даже если вы сделаете этот файл исполняемым, на сервере вам могут потребоваться права администратора для запуска. Я мог бы запустить командную строку, но выполнение скрипта не было бы найдено, попробуйте запустить скрипт в sudo, тогда вы узнаете, разрешено ли вам запускать скрипт как root или нет.
Таким образом, решение для того, чтобы заставить 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.
Похоже, 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)