PulseAudio 一直在我的系统上运行,如果它崩溃或我关闭它,它总是会立即重新启动。然而,我从来没有真正开始脉冲音频。
我已经检查过/etc/init.d/
和/etc/X11/Xsession.d/
,并且我已经检查过systemctl list-units -a
,但 PulseAudio 却找不到。
为什么 PulseAudio 似乎神奇地自行启动而无需我运行它,并且当它死掉时它如何立即重新启动?
我正在使用带有 xinit 和 i3 窗口管理器的 Debian 8 (jessie) 以及 PulseAudio 5。
答案1
似乎任何链接到 libpulse* 系列共享对象的进程(无论是在运行 X 和 i3 窗口管理器之前还是之后)都可能在您的用户进程下隐式自动生成 PulseAudio 服务器,作为尝试与音频子系统交互的副产品。 PulseAudio 的创造者 Lennart Poettering 似乎证实了这一点,在2015-05-29 发送电子邮件至 systemd-devel 邮件列表:
“pulseaudio 通常不是系统服务,而是用户服务。除非您的用户会话也完全转换为由 systemd 管理(这不太可能),否则 systemd 根本不参与启动它。
“PA 通常从会话设置脚本或服务启动。例如,在 Gnome 中,这是 gnome-session。如果使用了库,它也会按需自动生成,并注意它是否丢失。”
例如,在 Debian Stretch(测试)上,Web 浏览器 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 页面,“运行 PulseAudio”,似乎证实了这一点:
“......通常某些后台应用程序会立即重新连接,导致服务器立即重新启动。”
您似乎表明您通过控制台(通过运行 xinit)启动 i3 窗口管理器,并且不使用显示管理器或桌面环境。这个答案的其余部分详细介绍了那些使用 GNOME、KDE 等的人的信息。
有关 GNOME/KDE 自动启动的附加信息
Debian Jessie(稳定版)amd64 中的 PulseAudio 软件包(5.0-13)安装以下四个系统文件:
- /etc/xdg/autostart/pulseaudio-kde.desktop
- /etc/xdg/autostart/pulseaudio.desktop
- /usr/bin/start-pulseaudio-x11
- /usr/bin/start-pulseaudio-kde
一些图形会话管理器会自动运行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 页面“运行 PulseAudio”。
此外,在其他发行版中,某些显示管理器可能会启动 PulseAudio(例如,SDDM,ArchLinux 上。尽管维护者现在可能已经解决了这个问题)。
答案2
PulseAudio 是如何开始的?
虽然这仍然是一个有效的问题,但其答案随着时间的推移而发生了变化。前面的答案要么不充分,要么不正确,因为现在 PulseAudio 由用户的 systemd 自动启动,而当用户登录时,它又由系统的 systemd 启动。
$ systemctl --user status pulseaudio
● pulseaudio.service - Sound Service
Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; enabled; vendor pre
Active: active (running) since Tue 2020-03-14 15:29:56 ZULU; 13s ago
Main PID: 31080 (pulseaudio)
CGroup: /user.slice/user-1000.slice/[email protected]/pulseaudio.service
├─31080 /usr/bin/pulseaudio --daemonize=no
└─31081 /usr/lib/x86_64-linux-gnu/pulse/gsettings-helper
杀死 PulseAudio
要停止 PulseAudio 进程并使其不立即启动新实例,请使用systemctl --user stop
:
$ systemctl --user stop pulseaudio.service pulseaudio.socket
禁用 PulseAudio
如果您不希望 PulseAudio 在登录时自动启动,您可以像这样禁用它:
$ systemctl --user disable pulseaudio.service pulseaudio.socket
(顺便说一句,即使禁用它,您仍然可以在需要时使用 启动 PulseAudio systemctl --user start
。)
一般性地回答问题
上面的命令就是您所需要的。但是,如果您对如何自己找出解决方案感兴趣,请继续阅读。
查看声卡打开了哪些进程
使用lsof
或fuser -v
命令查看哪些进程打开了设备文件。
$ lsof /dev/snd/*
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
pulseaudi 32768 hackerb9 3u CHR 116,5 0t0 15499 /dev/snd/controlC0
找出什么进程启动了PulseAudio
用于pstree -s
显示父进程,如下所示:
$ pstree -sp 32768
systemd(1)───systemd(738)───pulseaudio(32768)─┬─gsettings-helpe(32769)─┬─{gsett+
│ ├─{gsett+
│ └─{gsett+
└─{pulseaudio}(32773)
systemd
我用它来查看 PulseAudio 实际上是由在我自己的帐户中运行的(PID 738)实例启动的:
$ ps -fp 738
UID PID PPID C STIME TTY TIME CMD
hackerb9 738 1 0 Feb10 ? 00:00:00 /lib/systemd/systemd --user
从那里,很容易猜测需要使用来systemctl --user
阻止它。
答案3
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
答案4
从 debian wheezy 升级到 jessie 后,Thushi/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.
pulsaudio-daemon 启动了两次。一次由 rtkit-daemon 执行,其他时间由 GNOME/KDE AUTOSTART 或其他应用程序执行。无论如何在 /etc/pulse/client.conf 中设置
autospawn = no
daemon-binary = /bin/true
解决了我的问题。我唯一无法确认的是 /etc/rcX.d 目录中不再有任何启动脚本。非常清楚,因为 rtkit-daemon 通过与 systemd 交互来完成工作。