或者

或者

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)安装以下四个系统文件:

  1. /etc/xdg/autostart/pulseaudio-kde.desktop
  2. /etc/xdg/autostart/pulseaudio.desktop
  3. /usr/bin/start-pulseaudio-x11
  4. /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。)


一般性地回答问题

上面的命令就是您所需要的。但是,如果您对如何自己找出解决方案感兴趣,请继续阅读。

查看声卡打开了哪些进程

使用lsoffuser -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 = yesautospawn = 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 交互来完成工作。

相关内容