![太长了;博士](https://linux22.com/image/209118/%E5%A4%AA%E9%95%BF%E4%BA%86%EF%BC%9B%E5%8D%9A%E5%A3%AB.png)
太长了;博士
$ 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 &