脚本由 udev 触发并永远运行

脚本由 udev 触发并永远运行

我需要记录来自 的输出/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

旧的环境变量不再可用,必须通过参数获取它

相关内容