我有一块装有 Lubuntu 操作系统的橙色 PI 板。我需要将其配置为在插入 USB 闪存驱动器时自动运行 1.mp4 文件。我该怎么做?我试过了udev但无法运行 VLC,错误代码为 1:
Process '/usr/bin/vlc' failed with exit code 1
这是我的规则文件:
ACTION=="add", KERNEL=="sd*", SUBSYSTEMS=="usb", RUN+="/usr/bin/vlc"
答案1
介绍
udev/udisks 系统旨在简化和自动化使设备/磁盘可供用户空间应用程序使用...是的,它们可以通过 udev 规则理解用户定义的规则,但在我看来,这些规则用于调整和修复基本问题,并不适合添加用户所需的额外功能...对于这种扩展/高级用法,更好的方法是在 udev 之外使用 shell 脚本、cron 作业、用户启动应用程序甚至自定义systemd
单元(服务)。
但是,处理 udev 规则时必须考虑一些注意事项...
第一点
您没有提供输入参数vlc
...您需要指定媒体输入源,例如,在您的情况下,为 MP4 文件的完整路径。
第二条注释
vlc
需要运行显示服务器,该服务器可能作为 udev 规则的环境变量提供,也可能不提供,因此可能需要明确设置显示服务器的地址/名称(例如可以找到echo "$DISPLAY"
) 环境变量,然后直接运行命令,例如DISPLAY=":0" /bin/vlc file.mp4
。
它还启动了一个完整的 GUI 界面,这可能超出了您执行这种简单任务的实际需要......cvlc
但是,是 VLC 多媒体播放器的无头变体,运行时无需 GUI...所以您可能想尝试一下。
第三条注释
udev 规则以用户身份运行root
(无需实际登录...因此需要用户运行时环境来运行 VLC 等用户空间应用程序)以及在它们之下运行的命令/脚本也运行root
……显示服务器和音频服务器通常不会root
默认运行...因此,当前登录的用户(以外root
)可以指定克服这个限制,例如通过将命令放在su
命令字符串中,如(更改username
为实际所需的调用用户名):
su username -c 'DISPLAY=":0" /bin/vlc file.mp4'
第四条注释
触发 udev 规则的设备无法供您的用户空间应用程序使用,因为vfsmount
(虚拟文件系统挂载) 甚至作为设备文件,/dev/
直到它触发的规则完成执行...因此,如果您想要使用该 udev 规则播放的文件位于触发它的同一设备上,那么这可能是一个不可能的情况...请参阅此类似帖子中的原因和如何克服这个问题:udev 中 bash 脚本的不同行为
第五音符
在 udev 中可以执行的任务是有限制的...除了上面提到的文件系统挂载限制之外,由于安全/隔离原因,udev 规则也无法使用网络...但是,有一些可行的解决方法,例如启动并分离子 shell,以特定特权用户身份在后台运行此类命令。