PulseAudio 如何启动?

Hub*_*bro 31 linux debian pulseaudio

PulseAudio 始终在我的系统上运行,如果它崩溃或我杀死它,它总是会立即重新启动。但是,我从未真正启动过PulseAudio。

我已经检查过/etc/init.d/并且/etc/X11/Xsession.d/我已经检查过systemctl list-units -aPulseAudio 无处可寻。

为什么 PulseAudio 似乎神奇地自行启动而我从未运行过它,它如何在它死后立即重新启动?

我正在使用带有 xinit 和 i3 窗口管理器的 Debian 8 (jessie) 和 PulseAudio 5。

iok*_*ins 24

似乎任何链接到 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
Run Code Online (Sandbox Code Playgroud)

您可能会看到哪些正在运行的进程链接到 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
Run Code Online (Sandbox Code Playgroud)

要告诉这些进程不要自动生成 PulseAudio,请编辑 ~/.config/pulse/client.conf 并添加行

autospawn = no
Run Code Online (Sandbox Code Playgroud)

PulseAudio 及其库通常尊重该设置。

通过运行进程链接的 libpulse* 也可能表明为什么 PulseAudio 重生如此之快。FreeDesktop.org 页面“ Running PulseAudio ”似乎证实了这一点:

“...通常某些后台应用程序会立即重新连接,导致服务器立即重新启动。”

您似乎表明您通过控制台(通过运行 xinit)启动 i3 窗口管理器,并且不使用显示管理器或桌面环境。这个答案的其余部分详细介绍了那些使用 GNOME、KDE ​​等的人的信息。

附加信息,适用于 GNOME/KDE 自动启动

软件包 PulseAudio (5.0-13),在 Debian Jessie (Stable) amd64 中,安装以下四个系统文件

  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
Run Code Online (Sandbox Code Playgroud)

这些脚本调用 PulseAudio 客户端 /usr/bin/pactl 来加载 PulseAudio 模块,这会生成 PulseAudio 服务器作为副产品(注意:如果您将 autospawn 设置为“no”,pactl 会尊重它并且不会自动生成 PulseAudio 服务器)。

更多详细信息,请访问 FreeDesktop.org 页面“运行 PulseAudio ”。

此外,在其他发行版中,一些显示管理器可能会启动 PulseAudio(例如,在 ArchLinux 上的 SDDM。虽然维护人员现在可能已经解决了这个问题)。


hac*_*rb9 13

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/user@1000.service/pulseaudio.service
           ??31080 /usr/bin/pulseaudio --daemonize=no
           ??31081 /usr/lib/x86_64-linux-gnu/pulse/gsettings-helper
Run Code Online (Sandbox Code Playgroud)

杀死 PulseAudio

要停止 PulseAudio 进程并让它不立即启动新实例,请使用systemctl --user stop

$ systemctl --user stop pulseaudio.service pulseaudio.socket
Run Code Online (Sandbox Code Playgroud)

禁用 PulseAudio

如果您不希望 PulseAudio 在登录时自动启动,您可以像这样禁用它:

$ systemctl --user disable pulseaudio.service pulseaudio.socket
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,即使禁用它,您仍然可以在需要时使用 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
Run Code Online (Sandbox Code Playgroud)

找出启动PulseAudio的进程

使用pstree -s表明,像这样的父进程:

$ pstree -sp 32768
systemd(1)???systemd(738)???pulseaudio(32768)???gsettings-helpe(32769)???{gsett+
                                              ?                        ??{gsett+
                                              ?                        ??{gsett+
                                              ??{pulseaudio}(32773)
Run Code Online (Sandbox Code Playgroud)

我用它来查看 PulseAudio 实际上是由systemd在我自己的帐户中运行的(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
Run Code Online (Sandbox Code Playgroud)

从那里,很容易猜测需要使用systemctl --user它来阻止它。

  • 很好的答案。我试过了,似乎是正确的。 (2认同)

Thu*_*shi 5

Pulseaudio 是一个小守护进程。man pulseaudio说你可以用命令关闭它,pulseaudio --kill但这样做会再次重生——它会自己重生。一个普通的 init 脚本可以在启动时启动它,/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
Run Code Online (Sandbox Code Playgroud)

现在我们可以处理正常的 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
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的文字似乎来自 Carla Schroder 2010 年的一篇文章:http://www.linuxplanet.com/linuxplanet/tutorials/7130/2。这些说明似乎不再适用于 Debian Jessie 和 PulseAudio (5.0-13)。 (3认同)