为什么我的可执行文件不能从通过 udev 调用的 bash 脚本运行?

为什么我的可执行文件不能从通过 udev 调用的 bash 脚本运行?

我有一个从我的代码编译的可执行文件。当我使用 将串行设备插入我的 Raspberry Pi Zero W 时,我尝试运行此可执行文件udev。但是,由于某种原因,可执行文件将无法运行,我查看过,top没有任何进程的迹象。

这是我的 udev 规则文件/etc/udev/rules.d/10-serial-usb.rules

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="1-1.3", ATTR{idProduct}=="7523", ATTR{idVendor}=="1a86", RUN="/bin/bash /home/blackbox/blackbox-cpp/run.sh"

这是 bash 脚本/home/blackbox/blackbox-cpp/run.sh

#!/bin/bash

/home/blackbox/blackbox-cpp/bin/blackbox &

bash 脚本肯定会运行,因为我使用了脚本中的mkdir和等touch命令来测试它是否确实正在运行,并且它们都正常工作。那么为什么我的可执行文件不同呢?

让我澄清一下,通过不工作,我的意思是可执行文件似乎没有与top.

答案1

因此,为了回答我自己的问题,事实证明读取我的配置文件时出现错误。我正在使用 JSON 文件读取一组配置,因为udev从根目录运行项目,所以找不到该文件。

因此,为了解决这个问题,我必须在 bash 脚本中进行更改,将更改目录插入到配置文件的路径中。

#!/bin/bash

cd /home/guy/blackbox-cpp/
bin/blackbox

感谢@terdon 帮助我发现了错误。

答案2

top显示最高的 CPU 用户(默认)。该列表不是所有正在运行的进程的列表。您的应用程序可能使用很少的 CPU,因此它可能不会位于顶部。

要确保该进程不运行,请尝试

ps -ef | grep blackbox

您还可以将脚本更改为:

#!/bin/bash
echo $$ > /tmp/blackbox.sh.pid
/home/blackbox/blackbox-cpp/bin/blackbox

并执行其中pstree -an xxxxxxxxxx 是 PID 文件中的 PID。

答案3

man 7 udev

不允许启动守护进程或其他长时间运行的进程;分叉的进程,无论是否分离,都将在事件处理完成后被无条件终止。

如果您想在 udev 规则中运行后台进程,请创建 systemd 服务并使用 启动它systemctl start <your_service>

相关内容