我想注册 3 个设备(它们是 USB CAN)和 1 个 USB,以便在 Linux(Ubuntu)中使用 systemd 和服务打开设备时立即自动运行。
我正在使用 Nvidia 的 Jetson nano 开发板和 Ubuntu 18.04 版本。
这是我所做的。
首先,将此脚本添加到 rules.d/99-systemd.rules 末尾
# Socket CAN interface
KERNEL=="ttyACM0", SYMLINK="ttyACM0", TAG+="systemd"
KERNEL=="ttyACM1", SYMLINK="ttyACM1", TAG+="systemd"
KERNEL=="ttyACM2", SYMLINK="ttyACM2", TAG+="systemd"
# DTG interface
KERNEL=="ttyUSB0", SYMLINK="ttyUSB0", TAG+="systemd"
像这样 99-systemd.rules
其次,我制作了如下的服务文件。
[Unit]
Description= xx Router Running script
BindsTo=dev-ttyACM0.device
BindsTo=dev-ttyACM1.device
BindsTo=dev-ttyACM2.device
BindsTo=dev-ttyUSB0.device
After=dev-ttyACM0.device
After=dev-ttyACM1.device
After=dev-ttyACM2.device
After=dev-ttyUSB0.device
[Service]
ExecStart=/home/sgr-100-nano/xx.sh
[Install]
WantedBy=multi-user.target
如果我将所有设备连接到 Jetson 开发板,它就能正常运行。(我不仅可以通过运行 .sh 文件来检查,还可以使用 ifconfig 来检查)
但如果有任何未连接,那么服务就会被终止。
于是我在 Google 上搜索如何解决这个问题。我发现在服务文件的 UNIT 部分使用“Wants”代替“Bindsto”可以解决这个问题。然后它将单独操作。
但它不起作用。服务文件无法设置设备。我在 ifconfig 中看不到任何设备(例如 can0、can1、can2)。
我知道如果我将每个单独的 UNIT 服务分开,就可以解决这个问题。
但我只想使用一个.service 文件。
答案1
我发现,在 .service 文件中,使用“Wants”代替“BindsTo”即可,如我上面所写。这样就成功了!
但打开设备(Jetson Nano)后需要几分钟。