树莓派Web端调用exec执行omxplayer脚本锁死问题求助
我之前也碰到过几乎一模一样的情况——本地用Putty执行PHP或者直接跑脚本都没问题,一到Web端调用就卡壳,视频完全启动不起来。结合你给出的细节(已经确认权限、基础命令能执行),问题大概率出在Web进程的运行环境和pi用户本地环境的差异上,给你几个针对性的解决方案:
1. 给Web用户添加视频设备访问权限
Web服务器默认用www-data用户运行,这个用户很可能没有访问树莓派视频输出设备的权限。执行下面的命令把它加入video组:
sudo usermod -aG video www-data
执行完记得重启Web服务器(比如sudo systemctl restart apache2)让权限生效。
2. 在脚本中指定DISPLAY环境变量
本地终端会话默认有DISPLAY=:0的环境变量,但Web进程是无交互的,没有这个变量,omxplayer找不到输出显示设备就会挂起。修改你的playmovie.sh脚本,在omxplayer命令前加上环境变量设置:
#!/bin/bash # 添加上这行,指定树莓派默认显示输出 export DISPLAY=:0 # 优化后台执行方式,把错误输出也重定向,避免进程挂起 nohup omxplayer -o hdmi /home/pi/Videos/$1 < /home/pi/master/cmd > /dev/null 2>&1 & echo . > /home/pi/master/cmd
这里用nohup让进程彻底脱离终端,同时把2>&1把错误输出也重定向到/dev/null,防止因为未处理的错误日志导致进程锁死。
3. 使用omxplayer的绝对路径(可选但保险)
虽然你说omxplayer -h能正常执行,但为了避免Web进程的PATH环境变量和本地不一致的问题,可以先查一下omxplayer的绝对路径:
which omxplayer
然后把脚本里的omxplayer替换成查到的路径(比如/usr/bin/omxplayer)。
为什么本地正常Web端不行?
本地用pi用户执行时,你有完整的终端会话,默认带了DISPLAY变量,而且pi用户本身就在video组里,能正常访问视频设备;但Web端的www-data是无交互用户,没有这些默认配置,导致omxplayer无法初始化输出,进而锁死进程。
按上面的步骤调整后,应该就能解决Web端执行锁死的问题了。
内容的提问来源于stack exchange,提问作者JoeS

