太长了;博士

太长了;博士

太长了;博士

$ sudo -u www-data mplayer -slave -input file=/srv/mplayer.fifo -playlist /srv/list &
$ lsof /srv/mplayer.fifo | tail +2
mplayer 21059 www-data    4u  FIFO  179,2      0t0 2359331 /srv/mplayer.fifo

$ cat /var/www/html/test
#!/usr/bin/bash
mplayer -slave -input file=/srv/mplayer.fifo -playlist /srv/list &

$ curl 'http://localhost/test' # mplayer starts playback (and keeps playing)
$ lsof /srv/mplayer.fifo
# no output!?

细节

在我的树莓派, 我有一个轻量级服务器正在运行。它应该启动并控制播放器过程。网络服务器以 启动 mplayer -slave -input file=/srv/mplayer.fifo。 (因此 mplayer 读取并执行该文件中的命令。)为了跳到下一首歌曲,其中一个网络服务器脚本会pt_skip 1写入/srv/mplayer.fifo.当 mplayer 从命令行运行时,这确实有效。但是当从lighttpd启动时,mplayer不会从/srv/mplayer.fifo.我不明白为什么。这就是我所做的:

设置

$ mkfifo /srv/mplayer.fifo
$ chmod o+w /srv/mplayer.fifo
$ ls -l /srv/mplayer.fifo
prw-r--rw- 1 root root 0 Aug  7 12:11 /srv/mplayer.fifo

测试(从命令行运行)

$ sudo -u www-data mplayer -ao alsa -slave -input file=/srv/mplayer.fifo -playlist /srv/list -shuffle
$ lsof /srv/mplayer.fifo
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
mplayer 21059 www-data    4u  FIFO  179,2      0t0 2359331 /srv/mplayer.fifo
$ ps aux | grep mplayer
root     21058  0.0  0.2   4680  2400 pts/0    S+   12:13   0:00 sudo -u www-data mplayer -ao alsa -slave -input file=/srv/mplayer.fifo -playlist /srv/list -shuffle
www-data 21059 11.6  3.1 127928 30008 pts/0    SL+  12:13   0:01 mplayer -ao alsa -slave -input file=/srv/mplayer.fifo -playlist /srv/list -shuffle

这就像预期的那样。但如果我从 lighttpd 运行 mplayer ...

$ cat /var/www/html/play
#!/usr/bin/bash
mplayer -ao alsa -slave -input file=/srv/mplayer.fifo -playlist /srv/list -shuffle &

...它启动 mplayer,但 mplayer 实例未读取/srv/mplayer.fifo.lsof不产生任何输出:

$ lsof /srv/mplayer.fifo

$ ps aux | grep mplayer
www-data 21177 15.3  3.1 128212 29744 ?        SL   12:30   0:01 mplayer -ao alsa -slave -input file=/srv/mplayer.fifo -playlist /srv/list -shuffle

我还可以看到 mplayer 没有从管道读取,因为写入它会阻塞。 mplayer 日志没有显示任何异常。您知道为什么 mplayer 在从 lighttpd 运行时不从命名管道读取吗?

答案1

太长了;博士

export HOME=/var/www-data

细节

我从命令行比较了环境变量

sudo -u www-data env

通过lighttpd设置环境变量

#!/usr/bin/bash
env

事实证明,mplayer 需要HOME设置。使用此脚本,lsof /srv/mplayer.fifo显示 mplayer:

#!/usr/bin/bash
export HOME=/var/www
mplayer -ao alsa -slave -input file=/srv/mplayer.fifo -playlist /srv/list -shuffle &

相关内容