我有一个从我的代码编译的可执行文件。当我使用 将串行设备插入我的 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 xxxxx
xxxxx 是 PID 文件中的 PID。
答案3
看man 7 udev
:
不允许启动守护进程或其他长时间运行的进程;分叉的进程,无论是否分离,都将在事件处理完成后被无条件终止。
如果您想在 udev 规则中运行后台进程,请创建 systemd 服务并使用 启动它systemctl start <your_service>
。