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 中,安装以下四个系统文件:
一些图形会话管理器会在用户登录时自动运行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 由用户的 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 进程并让它不立即启动新实例,请使用systemctl --user stop:
$ systemctl --user stop pulseaudio.service pulseaudio.socket
Run Code Online (Sandbox Code Playgroud)
如果您不希望 PulseAudio 在登录时自动启动,您可以像这样禁用它:
$ systemctl --user disable pulseaudio.service pulseaudio.socket
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,即使禁用它,您仍然可以在需要时使用 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
Run Code Online (Sandbox Code Playgroud)
使用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它来阻止它。
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 = yes为autospawn = 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)