我需要记录来自 的输出/dev/ttyUSB0
。这就是我在连接上启动启动日志脚本的方式
pi@raspberrypi:/etc/udev/rules.d $ cat 50-text-log.rules
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", RUN+="/bin/bash /scripts/start-log"
/dev/ttyUSB0 > somefile
除了找出 /dev 中的路径之外,它本质上所做的就是 cat
但这会导致此消息service udev status
raspberrypi systemd-udevd[4990]: Spawned process '/bin/bash /scripts/start-log' [5018] is taking longer than 59s to complete
我已经尝试过这个:如何在 Udev 事件上运行长时间进程?
通过双叉,它已经在 8 秒后停止,这使得情况变得更糟。像这样更改 cgroup:(echo $$ >> /sys/fs/cgroup/cpu/tasks
尝试在 bash 中复制上面链接中描述的内容)不会改变任何内容,8 秒后仍然存在。
如何启动一个在 USB 设备连接时可以永久运行的脚本?
或者如何使用/etc/systemd/system
(“设备单元”)中的 .device 文件来完成此操作?这方面的信息太少了。
答案1
最终用 systemd 服务解决了这个问题。
这是无法运行超过 59 秒的旧内容:
旧的 udev 规则
猫 /etc/udev/rules.d/50-text-log.rules
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", RUN+="/bin/bash /scripts/start-log"
旧脚本
/脚本/启动日志
BASENAME="$(basename $DEVPATH)"
DEVICE="/dev/$BASENAME"
cat "${DEVICE}" >> somefile
而现在已经运行了 15 分钟或者其他什么:
新的 udev 规则
猫 /etc/udev/rules.d/50-text-log.rules
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ENV{SYSTEMD_WANTS}="log@$env{DEVPATH}.service"
$env{DEVPATH} 将作为 $1 bash 变量中的常规命令行参数传递给服务
新服务
/etc/systemd/系统/[电子邮件受保护]
[Service]
Type=simple
TimeoutSec=0
GuessMainPID=false
ExecStart=/bin/bash -c "/scripts/start-log %I"
或者也许使用TimeoutSec=infinity
,看起来这是永久运行设置的较新变体。但由于=0
对我有用,我没有尝试。 (请参阅man systemd.service
并继续查看TimeoutStopSec=
通过简写进行配置的内容TimeoutSec=
)。我想我还需要重新启动。
新脚本
DEVPATH=$1
BASENAME="$(basename $DEVPATH)"
DEVICE="/dev/$BASENAME"
cat "${DEVICE}" >> somefile
旧的环境变量不再可用,必须通过参数获取它