Answers:
在运行X和i3窗口管理器之前或之后,链接到libpulse *共享对象家族的任何进程似乎都可能在用户进程下隐式自动生成PulseAudio服务器,作为尝试与音频子系统接口的副产品。PulseAudio的创建者Lennart Poettering似乎在2015年5月29日发送到systemd-devel邮件列表的电子邮件中确认了这一点:
“ pulseaudio通常不是系统服务,而是用户服务。除非您的用户会话也完全转换为由systemd管理(这不太可能),所以systemd根本不参与启动它。
“ PA通常是从会话设置脚本或服务启动的。例如,在Gnome中是gnome-session。如果使用了库,并且它是按需自动生成的,请注意它已丢失。”
例如,在Debian Stretch(测试)上,网络浏览器IceWeasel链接到两个libpulse *共享对象:1)libpulsecommon-7.1.so;和2)libpulse.so.0.18.2:
k@bucket:~$ ps -ef | grep iceweasel
k 17318 1 5 18:58 tty2 00:00:15 iceweasel
k 17498 1879 0 19:03 pts/0 00:00:00 grep iceweasel
k@bucket:~$ sudo pmap 17318 | grep -i pulse
00007fee08377000 65540K rw-s- pulse-shm-2442253193
00007fee0c378000 65540K rw-s- pulse-shm-3156287926
00007fee11d24000 500K r-x-- libpulsecommon-7.1.so
00007fee11da1000 2048K ----- libpulsecommon-7.1.so
00007fee11fa1000 4K r---- libpulsecommon-7.1.so
00007fee11fa2000 8K rw--- libpulsecommon-7.1.so
00007fee121af000 316K r-x-- libpulse.so.0.18.2
00007fee121fe000 2044K ----- libpulse.so.0.18.2
00007fee123fd000 4K r---- libpulse.so.0.18.2
00007fee123fe000 4K rw--- libpulse.so.0.18.2
您可能会看到哪些正在运行的进程链接到libpulse *。例如,首先获取libpulse *共享对象的列表,然后在每个对象上运行lsof(注意:这来自Debian Stretch(测试),因此您的输出可能会有所不同):
sudo find / -type f -name "*libpulse*"
*snip*
/usr/lib/x86_64-linux-gnu/pulseaudio/libpulsedsp.so
/usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
/usr/lib/x86_64-linux-gnu/libpulse.so.0.18.2
/usr/lib/x86_64-linux-gnu/libpulse-simple.so.0.1.0
/usr/lib/x86_64-linux-gnu/libpulse-mainloop-glib.so.0.0.5
/usr/lib/libpulsecore-7.1.so
/usr/lib/ao/plugins-4/libpulse.so
sudo lsof /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
gnome-she 864 Debian-gdm mem REG 252,1 524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
gnome-set 965 Debian-gdm mem REG 252,1 524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
gnome-set 1232 k mem REG 252,1 524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
gnome-she 1286 k mem REG 252,1 524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
chrome 2730 k mem REG 252,1 524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
pulseaudi 18356 k mem REG 252,1 524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
要告诉这些进程不要自动生成PulseAudio,请编辑〜/ .config / pulse / client.conf并添加一行
autospawn = no
通常,PulseAudio及其库均遵循该设置。
通过运行进程进行的libpulse *链接可能还表明了为什么PulseAudio如此迅速地重生。FreeDesktop.org页面“ Running PulseAudio ”似乎证实了这一点:
“ ...通常,某些后台应用程序将立即重新连接,从而导致服务器立即重新启动。”
您似乎表明您是通过控制台(通过运行xinit)启动i3窗口管理器的,并且不使用显示管理器或桌面环境。该答案的其余部分详细介绍了那些确实使用GNOME,KDE等的信息。
附加信息,用于GNOME / KDE自动启动
Debian Jessie(Stable)amd64中的Package PulseAudio(5.0-13)软件包安装以下四个系统文件:
一些图形会话管理器在用户登录时自动运行FreeDesktop.org自动启动脚本。反过来,PulseAudio自动启动脚本告诉图形会话管理器运行适当的PulseAudio启动脚本:
/usr/bin/start-pulseaudio-x11
/usr/bin/start-pulseaudio-kde
这些脚本调用PulseAudio客户端/ usr / bin / pactl加载PulseAudio模块,这将作为副产品生成PulseAudio服务器(注意:如果将autospawn设置为“ no”,则pactl会尊重并且不会自动生成PulseAudio服务器)。
在FreeDesktop.org页面“ Running PulseAudio ”上有更多详细信息。
另外,在其他发行版中,一些显示管理器可能会启动PulseAudio(例如,ArchLinux上的SDDM。尽管现在维护人员可能已经解决了这一问题)。
Pulseaudio是一个小守护程序。man pulseaudio
说您可以使用命令将其关闭,pulseaudio --kill
但这样做又需要重生-它会自动重生。可以使用普通的初始化脚本在启动时启动它/etc/rc2.d/S50pulseaudio
。但是,当您尝试以普通的Linux方式控制它时,它将无法运行,因为运行/etc/init.d/pulseaudio stop
不会停止它。删除/etc/rc2.d/S50pulseaudio
并不会阻止它在启动时启动。
要停止重生习惯,请打开/etc/pulse/client.conf
,将其更改autospawn = yes
为autospawn = no
,然后将daemon-binary设置为/bin/true
。确保这些行未注释,如下所示:
autospawn = no
daemon-binary = /bin/true
现在我们可以处理普通的Linux启动文件了。首先删除/etc/rc2.d/S50pulseaudio
。或者,您可以将其重命名为kill命令,以保留链接,以防万一您再次想要它:
$ mv /etc/rc2.d/S50pulseaudio /etc/rc2.d/K50pulseaudio
可能还有另外一个启动文件可以免除:/etc/X11/Xsession.d/70pulseaudio
。当Gnome会话开始时,这将启动Pulse。删除它或将其复制到其他目录,以备保存,然后再次验证确切的文件名。找到启动PulseAudio的脚本时,一个有用的技巧是将其调用的二进制文件从更改/usr/bin/pulseaudio
为/bin/true
。这是一个不错的小可执行文件,其唯一的工作就是“成功做任何事”。它使脚本保持快乐,并且如果您想将其改回,它是一个方便的占位符。
现在,您已经清除了所有启动和重生脚本,现在,使用以下命令停止和启动脉冲音频。
$ pulseaudio --kill
$ pulseaudio --start
从debian wheezy升级到jessie之后,Thuchhi / Carla Schroder给出的答案(请参阅下一个答案)仍然可以正常工作。在研究了我的启动消息后,我得到了以下错误(该错误在最后一行中列出)。
root@voylinx:/etc#journalctl -b | grep pulseaudio
Dez 31 16:19:46 voylinx rtkit-daemon[1507]: Successfully made thread 1506 of process 1506 (/usr/bin/pulseaudio) owned by '1000' high priority at nice level -11.
Dez 31 16:19:49 voylinx rtkit-daemon[1507]: Successfully made thread 1526 of process 1506 (/usr/bin/pulseaudio) owned by '1000' RT at priority 5.
Dez 31 16:19:49 voylinx rtkit-daemon[1507]: Successfully made thread 1527 of process 1506 (/usr/bin/pulseaudio) owned by '1000' RT at priority 5.
Dez 31 16:19:49 voylinx rtkit-daemon[1507]: Successfully made thread 1528 of process 1506 (/usr/bin/pulseaudio) owned by '1000' RT at priority 5.
Dez 31 16:19:49 voylinx rtkit-daemon[1507]: Successfully made thread 1533 of process 1506 (/usr/bin/pulseaudio) owned by '1000' RT at priority 5.
Dez 31 16:19:50 voylinx rtkit-daemon[1507]: Successfully made thread 1548 of process 1548 (/usr/bin/pulseaudio) owned by '1000' high priority at nice level -11.
Dez 31 16:19:50 voylinx pulseaudio[1548]: [pulseaudio] pid.c: Daemon already running.
Pulseaudio-daemon启动了两次。一次由rtkit守护程序执行,另一次由GNOME / KDE AUTOSTART或其他应用程序执行。无论如何在/etc/pulse/client.conf中进行设置
autospawn = no
daemon-binary = /bin/true
解决了我的问题。我无法确认的唯一一件事是,任何/etc/rcX.d目录中都没有任何启动脚本。很清楚,因为rtkit守护程序通过systemd的交互来完成工作。
systemctl list-units -a
它不包括PulseAudio。xinit从中启动脚本,/etc/X11/Xsession.d
并且如上所述,它也不包含PulseAudio。